1. Trang chủ
  2. » Luận Văn - Báo Cáo

Đề Tài 6 Cây Nhị Phân Và Mã Huffman. Viết Trình Chuyển Đổi Bản Text Tiếng Anh Sang Nhị Phân Nhờ Huffman Codding.pdf

24 0 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Nội dung

Trang 1

TRƯỜNG ĐẠI HỌC ĐẠI NAMKHOA CÔNG NGHỆ THÔNG TIN

BÀI TẬP LỚN

MÔN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Đề tài 6: Cây nhị phân và mã Huffman Viết trình chuyển đổi bảntext Tiếng Anh sang nhị phân nhờ Huffman codding

Hà Nội, tháng 12 năm 2021Giảng viên hướng dẫn: Nguyễn Lê AnhSinh viên thực hiện

Mã sinh viên

Nguyễn Thị Hải1351020035

Trang 2

LỜI CAM ĐOAN

Em xin cam đoan đề tài 6: Cây nhị phân và mã Huffman Viết trình chuyển đổibản text Tiếng Anh sang nhị phân nhờ Huffman codding do cá nhân em nghiên c4u vàth5c hiê 6n

Em đã kiểm tra dữ liệu theo quy định hiện hành

Kết quả bài làm của đề tài 6 là trung th5c và không sao chép từ bất kỳ bài tập củabạn khác

Các tài liê 6u đưFc sG dHng trong tiểu luận cI nguJn gKc, xuất x4 rM ràng

(Ký và ghi rõ họ tên)

Hải Nguyễn Thị Hải

Trang 3

MỞ ĐẦU

Mạng Internet là xu hướng phát triển của thế giới ngày nay Hiện nay, Internet đãtrở nên rất phổ biến trên toàn thế giới Thông qua mạng Internet mọi người cI thể trao đổithông tin với nhau một cách nhanh chIng thuận tiện Khi một người muKn trao đổi thôngtin với một người hay một tổ ch4c nào đI thông qua mạng máy tính thì yêu cầu quantrọng là làm sao để đảm bảo thông tin không bị sai lệch hoặc bị lộ do s5 xâm nhập của kẻth4 ba.

Trước các yêu cầu cần thiết đI, một sK giải thuật mã hIa đã đưFc xây d5ng nhằmđảm bảo tính an toàn dữ liệu tại nơi lưu trữ cũng như khi dữ liệu đưFc truyền trên mạng,như các giải thuật Huffman, giải thuật mã hIa đKi x4ng (DES), giải thuật mã hIa côngkhai RSA, Việc tìm hiểu và xây d5ng chương trình các giải thuật này cũng không nằmngoài mHc đích của bài tập lớn môn học này NI cI nhiệm vH tìm hiểu lý thuyết về mậtmã hoá thông tin.

Thuật toán Huffman, đây đưFc coi là thuật toán mã hIa cơ bản nhất, từ đI chúngta sẽ cI cách nhìn về các phương pháp mã hIa dữ liệu và các 4ng dHng của nI.

Xuất phát từ những nhu cầu của th5c tế cũng như để củng cK và áp dHng nhữngkiến th4c đã đưFc học trong môn Cấu trúc dữ liệu và giải thuật nên em đã chọn đề tài 6:“Cây nhị phân và mã Huffman Viết trình chuyển đổi bản text Tiếng Anh sang nhị phânnhờ Huffman codding”.

Trang 4

LỜI CẢM ƠN

Em xin chân thành cảm ơn s5 giúp đỡ, chỉ bảo của thầy Nguyễn Lê Anh trong quátrình học tập môn Cấu trúc dữ liệu và giải thuật cũng như trong quá trình làm bài tập lớnkết thúc môn học Thầy đã tạo điều kiện, chỉ bảo ân cần, cung cấp những kiến th4c cầnthiết trong quá trình học tập môn Cấu trúc dữ liệu và giải thuật Ngoài ra, thầy đã lấynhững ví dH cH thể của các phần kiến th4c tương 4ng để em cI thể hiểu đưFc cách sGdHng của kiến th4c đI như thế nào Thông qua những kiến th4c đI giúp cho em cI thểhoàn thành đưFc bài tập lớn kết thúc môn Cấu trúc dữ liệu và giải thuật, đJng thời đIcũng là những kiến th4c nền tảng để em cI thể học thêm các kiến th4c sâu hơn.

Song, do còn nhiều hạn chế nên đề tài em xây d5ng không tránh khỏi những thiếusIt Rất mong đưFc thầy đIng gIp ý kiến để hoàn thiện hơn.

Một lần nữa, em xin chân thành cảm ơn!

Trang 5

NHẬN XÉT(Của giảng viên hướng dẫn)

Trang 6

2 MHc đích và đKi tưFng nghiên c4u 7

3 Phương pháp nghiên c4u 7

Chương II Cây Nhị Phân 8

1 Cấu trúc dữ liệu cây là gì? 8

2 Cây nhị phân (Binary tree) 8

3 Cây nhị phân tìm kiếm (Binary search tree) 9

Chương II Mã Huffman 10

Chương III Viết trình chuyển đổi bản text tiếng anh sang 14

nhị phân nhờ huffman codding và kết quả chạy trình 14

Trang 8

nhiều sản phẩm phần mềm, ngoài ra là việc xG lý nhiều tập tin và nhiều loại dữliệu khác nhau Do vậy, nén dữ liệu vẫn là vấn đề cần thiết đưFc th5c hiện trướckhi lưu trữ Song song với vấn đề trên, một lĩnh v5c không thể không kể đến làmạng máy tính Ngày nay, mạng máy tính mà mọi người đều nhắc đến là mạngInternet -mạng của các mạng- CI thể nIi rằng: Internet là mạng thông tin toàn cầuvà sK người kết nKi vào mạng đã lên đến vài chHc triệu người.

2 MHc đích và đKi tưFng nghiên c4u

ĐKi với mạng Internet, th5c hiện tKt điều đI cho phép giảm đưFc cước phítruy cập mạng Vậy nén dữ liệu là gì? Ta cI thể khái quát: Nén là quá trình giảmdung lưFng nhớ cần thiết mà vẫn biểu diễn cùng một dữ liệu cho trước Trongtruyền thông sK liệu, nén là một kỹ thuật đưFc áp dHng một cách linh hoạt choluJng thông tin đang truyền Công nghệ bên trong về cơ bản cũng như nhau trongcả hai trường hFp là: loại bỏ thông tin dư thừa hoặc biểu thị thông tin dưới dạngchặt chẽ hơn để giảm tổng sK byte phải truyền qua phương tiện truyền thông nhằmgiảm đến thấp nhất thời gian chiếm phương tiện của một cuộc truyền đã cho ĐKivới nén dữ liệu trên máy PC, cI nhiều thuật toán nén khác nhau đưFc thiết kế chonhiều loại dữ liệu khác nhau như: văn bản, hình ảnh, âm thanh Trong phạm vi củađJ án, ta chỉ xét đến các phương pháp nén văn bản Nén văn bản là biểu diễn lạilưFng thông tin sao cho cI kích thước nhỏ hơn ban đầu và một yêu cầu không thểthiếu là dữ liệu của tập tin gKc phải luôn luôn đưFc khôi phHc lại hoàn toàn chínhxác vì đKi với loại văn bản này, s5 mất mát thông tin dù chỉ một bit là điều khôngthể chấp nhận đưFc Hiện nay, cI nhiều phương pháp nén văn bản khác nhau trongđI ta sẽ xét đến phương pháp nén Huffman Là một trong những phương pháp nénra đời sớm nhất và đã thành công trong lưu trữ máy tính và viễn thông, phươngpháp này thích hFp với kiểu dữ liệu văn bản

Trang 9

3 Phương pháp nghiên c4u

Tư tưởng chính của phương pháp như sau: Thay vì lưu trữ mỗi ký hiệu là 8bit (mã ASCII), d5a vào xác suất (tần suất xuất hiện) của mỗi ký hiệu mà ta sẽbiểu diễn ít bit đKi với ký hiệu cI xác suất cao và nhiều bit để biểu diễn ký hiệu cIxác suất thấp Ví dH ta cI luJng dữ liệu là :AABBAADCCC, với mỗi ký hiệuđưFc lưu trữ bình thường là 8 bit thì ta phải mất 8x10=80 bit, trong khi đI vớiphương pháp mã hoá Huffman d5a vào xác suất xuất hiện: A= 4/10,C=3/10,B=2/10,D=1/10, giả sG ta biểu diễn cho ký hiệu A là 1 bit, C là 2 bit, B là3 bit, D là 4 bit thì chỉ tKn lưFng bit là: 1x4+2x3+3x2+4x1=20 bit Như vậy, ta đãtiết kiệm đưFc 60 bit lưu trữ.

Chương II Cây Nhị Phân1 Cấu trúc dữ liệu cây là gì?

Cấu trúc dữ liệu cây là một cấu trúc biểu diễn các Node dưới dạng cây Như cácbạn đã học ở môn lập trình C/C++ thì khi chúng ta muKn lưu các phần tG, ta cI thể lưuchúng dưới dạng mảng một chiều Hoặc cI thể lưu dưới dạng một danh sách liên kết.Tương t5 như vậy các bạn cũng cI thể lưu dưới dạng cây nhị phân.

Ưu điểm của cấy trúc dữ liệu cây so với các cấu trúc khác là:Phân cấp dữ liệu.

Tìm kiếm dễ dàng hơn.

Thao tác trên các danh sách dữ liệu đã sắp xếp.

Trong cấu trúc dữ liệu cây, cI hai cấu trúc chính đI là cấu trúc cây nhị phân vàcấu trúc cây nhị phân tìm kiếm Sau đây chúng ta sẽ tìm hiểu qua về hai cấu trúc dữ liệunày nhé.

Trang 10

2 Cây nhị phân (Binary tree)

Cây nhị phân là một cấu trúc dữ liệu đưFc sG dHng cho mHc đích lưu trữ dữ liệu.Một cây nhị phân bao gJm các Node và mỗi Node bao gJm 3 thành phần:

Data: Giá trị của một phần tG

Left pointer: Con trỏ trỏ đến cây nhị phân bên trái Node.Right pointer: Con trỏ trỏ đến cây nhị phân bên phải Node.Các thành phần cơ bản của cây nhị phân bao gJm:

Root: ĐưFc gọi là Node gKc của cây (là một Node cha), một cây chỉ cI một NodegKc duy nhất và nI không cI Node cha nào.

Parent Node: Là Node cha của một Node cH thể nào đI.Child Node: Là Node con của một Node cH thể nào đI.Sub-tree: Là cây con biểu diển các con của một Node.LeafNode: Là Node không cI Node con.

Siblings: Các Node cI cùng một cha.Internal Node: Node cI ít nhất một Node con External Node: Node không cI Node con nào.4 Cây nhị phân tìm kiếm (Binary search tree)

Cây nhị phân tìm kiếm là một dạng đặc biệt của cây nhị phân Về cơ bản nI cI đủtất cả các thành phần của cây nhị phân Nhưng tất cả các Node của nI đều cI chung mộtđặc điểm sau:

Cây con bên trái của một Node luôn luôn cI giá trị nhỏ hơn hoặc bằng giá trịcủa Node cha phía trên nI.

Trang 11

Cây con bên phải của một Node luôn luôn cI giá trị lớn hơn hoặc bằng giá trịcủa Node cha phía trên nI.

Trong cây nhị phân tìm kiếm ta cI thể th5c hiện các thao tác sau:Chèn một phần tG vào trong một cây.

Tìm kiếm phần tG trong cây.Duyệt cây.

Đo chiều cao của cây.

Trên đây là các thao tác thường đưFc sG dHng nhiều trong cây Đặc biệt là tìmkiếm phần tG trong cây, như cái tên của nI là cây nhị phân tìm kiếm Đây là một cấu trúcdữ liệu đưFc sG dHng trong các bài toán tìm kiếm rất nhiều, bởi tính chính xác và tKc độcủa nI.

Chương II Mã Huffman

Trong khoa học máy tính và lý thuyết thông tin, mã hIa Huffman là một thuật toánmã hIa dùng để nén dữ liệu NI d5a trên bảng tần suất xuất hiện các kí t5 cần mã hIa đểxây d5ng một bộ mã nhị phân cho các kí t5 đI sao cho dung lưFng (sK bít) sau khi mãhIa là nhỏ nhất NIi chung dạng mã này chủ yếu phHc vH cho mHc đích nén thông tin làchính còn khả năng che dấu thông tin thì không đưFc đánh giá cao.

Thuật toán đưFc đề xuất bởi David A Huffman khi ông còn là sinh viên Ph.D tạiMIT, và công bK năm 1952 trong bài báo “A Method for the Construction of Minimum-Redundancy Codes” Sau này Huffman đã trở thành một giảng viên ở MIT và sau đI ởkhoa Khoa học máy tính của Đại học California, Santa Cruz, Trường Kỹ nghệ Baskin(Baskin School of Engineering).

Trong khoa học máy tính và lý thuyết thông tin, mã hIa Huffman là một thuật toánmã hIa dùng để nén dữ liệu NI d5a trên bảng tần suất xuất hiện các ký t5 cần mã hIa để

Trang 12

xây d5ng một bộ mã nhị phân cho các ký t5 đI sao cho dung lưFng (sK bit) sau khi mãhIa là nhỏ nhất.

Để mã hIa các ký hiệu (ký t5, chữ sK, ) ta thay chúng bằng các xâu nhị phân,đưFc gọi là từ mã của ký hiệu đI Chẳng hạn bộ mã ASCII, mã hIa cho 256 ký hiệu làbiểu diễn nhị phân của các sK từ 0 đến 255, mỗi từ mã gJm 8 bit Trong ASCII từ mã củaký t5 "a" là 1100001, của ký t5 "A" là 1000001 Trong cách mã hIa này các từ mã của tấtcả 256 ký hiệu cI độ dài bằng nhau (mỗi từ mã 8 bit) NI đưFc gọi là mã hIa với độ dàikhông đổi.

Khi mã hIa một tài liệu cI thể không sG dHng đến tất cả 256 ký hiệu Hơn nữatrong tài liệu chữ cái "a" chỉ cI thể xuất hiện 1000000 lần còn chữ cái "A" cI thể chỉ xuấthiện 2, 3 lần Như vậy ta cI thể không cần dùng đủ 8 bit để mã hIa cho một ký hiệu, hơnnữa độ dài (sK bít) dành cho mỗi ký hiệu cI thể khác nhau, ký hiệu nào xuất hiện nhiềulần thì nên dùng sK bit ít, ký hiệu nào xuất hiện ít thì cI thể mã hIa bằng từ mã dài hơn.Như vậy ta cI việc mã hIa với độ dài thay đổi Tuy nhiên, nếu mã hIa với độ dài thayđổi, khi giải mã ta làm thế nào phân biệt đưFc xâu bít nào là mã hIa của ký hiệu nào Mộttrong các giải pháp là dùng các dấu phẩy (",") hoặc một ký hiệu quy ước nào đI để táchtừ mã của các ký t5 đ4ng cạnh nhau Nhưng như thế sK các dấu phẩy sẽ chiếm một khônggian đáng kể trong bảng mã Một cách giải quyết khác dẫn đến khái niệm mã tiền tK

Mã tiền tK là bộ các từ mã của một tập hFp các ký hiệu sao cho từ mã củamỗi ký hiệu không là tiền tK (phần đầu) của từ mã một ký hiệu khác trongbộ mã ấy.

Đương nhiên mã hIa với độ dài không đổi là mã tiền tK.

Ví dH: Giả sG mã hIa từ "ARRAY", tập các ký hiệu cần mã hIa gJm 3 chữ cái"A","R","Y".

Trang 13

Nếu mã hIa bằng các từ mã cI độ dài bằng nhau ta dùng ít nhất 2 bit cho một chữcái chẳng hạn "A"=00, "R"=01, "Y"=10 Khi đI mã hIa của cả từ là 0001010010.Để giải mã ta đọc hai bit một và đKi chiếu với bảng mã.

Nếu mã hIa "A"=0, "R"=01, "Y"=11 thì bộ từ mã này không là mã tiền tK vì từ mãcủa "A" là tiền tK của từ mã của "R" Để mã hIa cả từ ARRAY phải đặt dấu ngăncách vào giữa các từ mã 0,01,01,0,11

Nếu mã hIa "A"=0, "R"=10, "Y"=11 thì bộ mã này là mã tiền tK Với bộ mã tiềntK này khi mã hIa xâu "ARRAY" ta cI 01010011.

Mã hIa dữ liệu trong máy tính

Để mã hIa các kí hiệu (bao gJm kí t5, chữ sK, …) trong máy tính, ta thay chúng bằngcác xâu nhị phân, đưFc gọi là từ mã của kí hiệu đI.

Ví dH bộ mã ASCII ra đời năm 1967, mã hIa cho 256 kí hiệu là biểu diễn nhị phâncủa các sK từ 0 đến 255, mỗi từ mã gJm 8 bit Trong ASCII từ mã của kí t5 “a”là 1100001, của kí t5 “A” là 1000001 Trong cách mã hIa này các từ mã của tất cả 256 kíhiệu cI độ dài bằng nhau (mỗi từ mã 8 bít) NI đưFc gọi là mã hIa với độ dài không đổi.

Khi mã hIa một tài liệu cI thể không sG dHng đến tất cả 256 kí hiệu Hơn nữa trongtài liệu chữ cái “a” chỉ cI thể xuất hiện 1000000 lần còn chữ cái “A” cI thể chỉ xuất hiện2, 3 lần Như vậy ta cI thể không cần dùng đủ 8 bit để mã hIa cho một ký hiệu, hơn nữađộ dài (sK bit) dành cho mỗi kí hiệu cI thể khác nhau, kí hiệu nào xuất hiện nhiều lần thìnên dùng sK bit ít, ký hiệu nào xuất hiện ít thì cI thể mã hIa bằng từ mã dài hơn Như vậyta cI việc mã hIa với độ dài thay đổi Để phân biệt đưFc xâu bít nào là mã hIa của kýhiệu nào, một trong các giải pháp là dùng các dấu phẩy (“,”) hoặc một kí hiệu quy ướcnào đI để tách từ mã của các kí t5 đ4ng cạnh nhau Nhưng như thế sK các dấu phẩy sẽchiếm một không gian đáng kể trong bản mã Một cách giải quyết khác dẫn đến kháiniệm mã phi tiền tK.

Mã phi tiền tK là bộ các từ mã của một tập hFp các kí hiệu sao cho từ mã của mỗi ký hiệu không là tiền tK (phần đầu) của từ mã một ký hiệu khác trong bộ mã ấy.

Trang 14

Ví dH cI từ “CNTT” gJm 3 chữ cái là C,N,T Nếu dùng cách mã hIa với độ dài khôngđổi thì mỗi chữ cái đưFc mã hIa tKi thiểu là 2 bit chẳng hạn C=00, N=01, T=10 Khi đI xâu đưFc mã hIa là 00011010.

Nếu mã hIa C=0, N=01, T=11 thì bộ từ mã này không là mã phi tiền tK vì từ mã của chữ C là tiền tK của từ mã của N Để mã hIa cả từ này ta phải đặt dấu ngăn cách vào giữacác từ mã 0,01,10,10.

Nếu mã hIa C=0, N=10, T=11 thì bộ mã này là mã phi tiền tK Với bộ mã phi tiền tK này thì xâu đưFc mã hIa là 0101111.

Mã Huffman ,mỗi mã phi tiền tK cI thể biểu diễn bởi một cây nhị phân T mà mỗi lácủa nI tương 4ng với một chữ cái và cạnh của nI đưFc gán cho một trong hai sK 0 hoặc1 Mã của một chữ cái c là một dãy nhị phân gJm các sK gán cho các cạnh trên đường đitừ gKc đến lá tương 4ng với c.

Bài toán: Tìm cách mã hIa tKi ưu, t4c là tìm cây nhị phân T làm tKi thiểu hIa tổng độdài cI trọng sK

B(T) = ∑ f(c) depth(c)

trong đI f(c) và depth(c) là tần sK và độ dài đường đi từ gKc đến lá tương 4ng với ký t5 c Ý tưởng: Chữ cái cI tần suất nhỏ hơn cần đưFc gán cho lá cI khoảng cách đến gKclà lớn hơn, chữ cái cI tần suất xuất hiện lớn hơn cần đưFc gán cho nút gần gKc hơn Ứng dHng mã hIa Huffman để nén file

Trang 15

NhưFc điểm của thuật toán Huffman trên (Huffman tĩnh) là quá trình mã hIa phảiduyệt dữ liệu 2 lần: một lần để xác định tần suất & d5ng cây mã, một lần nữa để mã hIa.Do đI, thuật toán Huffman động đưFc đề xuất (độc lập) bởi Faller (1973), Gallager(1978) và năm 1985, Knuth đưa ra một sK cải tiến và hoàn chỉnh thuật toán (vì thế thuậttoán này còn đưFc gọi là thuật toán FGK) NI cI một sK ưu điểm so với Huffman tĩnh làkhông cần tính trước sK lần xuất hiện của các kí t5, không cần lưu thông tin phHc vH choviệc giải nén, quá trình nén chỉ cần một lần duyệt file và cI thể nén trên dữ liệu phát sinhtheo thời gian th5c.

Chương III Viết trình chuyển đổi bản text tiếng anh sangnhị phân nhờ huffman codding và kết quả chạy trình1 Viết trình

// Chương trình C ++ (STL) dành cho Mã hIa Huffman với STL#include <bits/stdc++.h>

using namespace std;

// Một nút cây Huffmanstruct MinHeapNode {

// Một trong các ký t5 đầu vào char data;

// Tần sK của ký t5 unsigned freq;

Ngày đăng: 25/05/2024, 10:08

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w