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.. Xuất phát từ những nhu cầu của th5c tế cũng như để củ
Trang 1TRƯỜNG ĐẠI HỌC ĐẠI NAM
KHOA 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ản text Tiếng Anh sang nhị phân nhờ Huffman codding
Hà Nội, tháng 12 năm 2021
Giảng viên hướng dẫn : Nguyễn Lê Anh
Sinh viên thực hiện
Mã sinh viên
: :
Nguyễn Thị Hải 1351020035
Trang 2LỜ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 3MỞ ĐẦ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ật
mã 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úng
ta 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 4LỜ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 5NHẬN XÉT (Của giảng viên hướng dẫn)
Trang 6
MỤC LỤC
LỜI CAM ĐOAN 1
MỞ ĐẦU 2
LỜI CẢM ƠN 3
NHẬN XÉT 4
(Của giảng viên hướng dẫn) 4
MỤC LỤC 5
NỘI DUNG 6
CHƯƠNG I Tổng quan đề tài 6
1 Lí do chọn đề tài 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
1 Viết trình 14
2 Kết quả chạy trình 22
3 Giải thích 22
KẾT LUẬN 24
TÀI LIỆU THAM KHẢO 25
Trang 7NỘI DUNG CHƯƠNG I Tổng quan đề tài
1 Lí do chọn đề tài
Trong thời đại ngày nay với s5 phát triển mạnh mẽ của khoa học công nghệthông tin, việc 4ng dHng Tin học hầu như đã vào trong tất cả mọi lĩnh v5c hoạtđộng sản xuất của con người ở các nước phát triển trên thế giới Ở nước ta, nhằmgIp phần vào công cuộc Công nghiệp hoá-hiện đại hoá đất nước, vấn đề Tin họchoá đã và đang đưFc triển khai Việc 4ng dHng Tin học vào công tác quản lý vàđiều hành tại các cơ quan xí nghiệp ngày càng cao và đem lại hiệu quả Bên cạnh
đI, đJng nghĩa với nI là vấn đề lưu trữ và xG lý dữ liệu Cùng với thời gian, s5cập nhật, lưu trữ dữ liệu ngày càng nhiều, điển hình là một sK cơ quan hành chínhnhà nước như: chi cHc thKng kê của các tỉnh, thành phK, trung ương với một khKilưFng lớn dữ liệu cần lưu trữ Vì vậy, vấn đề đưFc đặt ra là làm sao lưu trữ dữ liệu
ít tKn kém nhất mà vẫn đảm bảo tính an toàn và chính xác của nI? Do đI, việc tìm
ra phương pháp giảm dung lưFng lưu trữ mà vẫn đáp 4ng đưFc yêu cầu trên là rấtcần thiết Chúng ta thấy rằng: ngày nay với s5 phát triển vưFt trội trong công nghệphần c4ng, dung lưFng đĩa c4ng tăng lên một cách đáng kể và nhanh chIng Mộtloạt đĩa c4ng không ngừng tăng lên về dung lưFng ra đời trong khi giá thành sảnphẩm lại hạ Bên cạnh đI còn cI các thiết bị lưu trữ khác như băng từ, đĩaquang.cũng đưFc sG dHng rộng rãi Tuy nhiên, cũng chính vì lý do này mà các nhàlập trình thường sG dHng bất c4 tài nguyên nào cI thể, kết quả là nhiều sản phẩmphần mềm ra đời nhưng cI kích thước rất lớn, chiếm hàng trăm Mbyte Thêm vào
đI, nhiều lĩnh v5c sản xuất áp dHng những phần mềm khác nhau, để đáp 4ng đưFcnhu cầu này đòi hỏi người sG dHng tiếp cận nhiều hơn và tạo thIi quen lưu trữ
Trang 8nhiề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ầu
và 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 trong
cả 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én
ra đờ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 93 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ân
1 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 102 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 11Câ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úc
dữ 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ã HuffmanTrong khoa học máy tính và lý thuyết thông tin, mã hIa Huffman là một thuật toán
mã 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án
mã 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 12xâ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ủ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 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á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ô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 trong
bộ 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 13Nế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ền
tK 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ệ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ơ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ậy
ta 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