Mã hóa Huffman

Trong khoa học máy tínhlý thuyết thông tin, mã hóa Huffman là một thuật toán mã hóa dùng để nén dữ liệu. Nó dựa trên bảng tần suất xuất hiện các ký tự cần mã hóa để xây dựng một bộ mã nhị phân cho các ký tự đó sao cho dung lượng (số bit) sau khi mã hóa là nhỏ nhất.

Tác giả

Thuật toán được đề xuất bởi David A. Huffman khi ông còn là sinh viên Ph.D. tại MIT, và công bố 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 đó ở 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).

Dẫn nhập

Mã tiền tố

Để mã hóa các ký hiệu (ký tự, chữ số,...) ta thay chúng bằng các xâu nhị phân, được gọi là từ mã của ký hiệu đó. Chẳng hạn bộ mã ASCII, mã hóa cho 256 ký hiệu là biểu diễn nhị phân của các số từ 0 đến 255, mỗi từ mã gồm 8 bit. Trong ASCII từ mã của ký tự "a" là 1100001, của ký tự "A" là 1000001. Trong cách mã hóa này các từ mã của tất cả 256 ký hiệu có độ dài bằng nhau (mỗi từ mã 8 bit). Nó được gọi là mã hóa với độ dài không đổi.

Khi mã hóa một tài liệu có thể không sử dụng đến tất cả 256 ký hiệu. Hơn nữa trong tài liệu chữ cái "a" chỉ có thể xuất hiện 1000000 lần còn chữ cái "A" có thể chỉ xuất hiện 2, 3 lần. Như vậy ta có thể không cần dùng đủ 8 bit để mã hóa cho một ký hiệu, hơn nữa độ dài (số bít) dành cho mỗi ký hiệu có thể khác nhau, ký hiệu nào xuất hiện nhiều lần thì nên dùng số bit ít, ký hiệu nào xuất hiện ít thì có thể mã hóa bằng từ mã dài hơn. Như vậy ta có việc mã hóa với độ dài thay đổi. Tuy nhiên, nếu mã hóa với độ dài thay đổi, khi giải mã ta làm thế nào phân biệt được xâu bít nào là mã hóa 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 ước nào đó để tách từ mã của các ký tự đứng cạnh nhau. Nhưng như thế số các dấu phẩy sẽ chiếm một không gian đá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 tố

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

Đương nhiên mã hóa với độ dài không đổi là mã tiền tố.

Ví dụ: Giả sử mã hóa từ "ARRAY", tập các ký hiệu cần mã hóa gồm 3 chữ cái "A","R","Y".
  • Nếu mã hóa bằng các từ mã có độ 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 đó mã hóa của cả từ là 0001010010. Để giải mã ta đọc hai bit một và đối chiếu với bảng mã.
  • Nếu mã hóa "A"=0, "R"=01, "Y"=11 thì bộ từ mã này không là mã tiền tố vì từ mã của "A" là tiền tố của từ mã của "R". Để mã hóa cả từ ARRAY phải đặt dấu ngăn cách vào giữa các từ mã 0,01,01,0,11
  • Nếu mã hóa "A"=0, "R"=10, "Y"=11 thì bộ mã này là mã tiền tố. Với bộ mã tiền tố này khi mã hóa xâu "ARRAY" ta có 01010011.

Biểu diễn mã tiền tố trên cây nhị phân

  • Nếu có một cây nhị phân lá ta có thể tạo một bộ mã tiền tố cho ký hiệu bằng cách đặt mỗi ký hiệu vào một lá. Từ mã của mỗi ký hiệu được tạo ra khi đi từ gốc tới lá chứa ký hiệu đó, nếu đi qua cạnh trái thì ta thêm số 0, đi qua cạnh phải thì thêm số 1.
  • Ví dụ: Cây 3 lá sau đây biểu diễn bộ mã của A,R,Y trong ví dụ trên
   *
  0/ \1
  A  *
   0/ \1
   R  Y
  • Từ mã của "A" là 0, của "R" là 10, của "Y" là 11.

Mã tiền tố tối ưu

Từ ví dụ trên thấy mã hóa của xâu "ARRAY" bằng mã độ dài cố định mất 10 bit, bằng mã tiền tố đã đưa ra mất 8 bit, tiết kiệm được 20%. Bài toán đặt ra là bộ mã tiền tố đã tối ưu chưa.

Bài toán

  • Cho tập A các ký hiệu và trọng số (tần suất) của chúng.
  • Tìm một bộ mã tiền tố với tổng độ dài mã hóa là nhỏ nhất.
Cây Huffman sinh ra từ xâu ký tự "this is an example of a huffman tree". Tổng số bit để mã hóa là 135, không kể các ký tự trống.

Dữ liệu

Input

Bảng chữ cái .
Tập các trọng số (tần suất xuất hiện) tương ứng , ví dụ: .

Output

Bộ mã , là tập hợp các từ mã (nhị phân), trong đó là từ mã của .

Yêu cầu

Đặt là trọng số của bộ mã . Điều kiện là: với mọi bộ mã .

Ví dụ

  • Trong ví dụ sau, với các tần số như trên mã 1 sẽ tốn không gian hơn mã 2.
Input Ký tự a b c d e  
tần suất 0.10 0.15 0.30 0.16 0.29 1,00
Mã 1 Từ mã 000 001 010 011 110  
Độ dài từ mã (bits) 3 3 3 3 3 3,00
Mã 2 Từ mã 000 001 10 01 11
Độ dài từ mã (bits) 3 3 2 2 2 2,25

Giải thuật

Giải thuật tham lam

Trong giải thuật tham lam giải bài toán xây dựng cây mã tiền tố tối ưu của Huffman, ở mỗi bước ta chọn hai chữ cái có tần số thấp nhất để mã hóa bằng từ mã dài nhất. Giả sử có tập A gồm ký hiệu và hàm trọng số tương ứng .

  • Khởi tạo: Tạo một rừng gồm n cây, mỗi cây chỉ có một nút gốc, mỗi nút gốc tương ứng với một ký tự và có trọng số là tần số/tần suất của ký tự đó .
  • Lặp:
    • Mỗi bước sau thực hiện cho đến khi rừng chỉ còn một cây:
    • Chọn hai cây có trọng số ở gốc nhỏ nhất hợp thành một cây bằng cách thêm một gốc mới nối với hai gốc đã chọn. Trọng số của gốc mới bằng tổng trọng số của hai gốc tạo thành nó.

Như vậy ở mỗi bước số cây bớt đi một. Khi rừng chỉ còn một cây thì cây đó biểu diễn mã tiền tố tối ưu với các ký tự đặt ở các lá tương ứng.

Ví dụ

Cho bảng tần suất của 5 chữ cái A, B, C, D, E như sau tương ứng là 0.10; 0.15; 0.30; 0.16; 0.29

A B C D E
0.10 0.15 0.30 0.16 0.29

Quá trình xây dựng cây Huffman diễn ra như sau:

Bước 1 và bước 2
Bước 1 và bước 2
Bước 3 và bước 4
Bước 5
Bước 5

Như vậy bộ mã tối ưu tương ứng là:

A B C D E
010 011 11 00 10

Hàng đợi có ưu tiên

Trong mỗi bước của thuật toán xây dựng cây Huffman, ta luôn phải chọn ra hai gốc có trọng số nhỏ nhất. Để làm việc này ta sắp xếp các gốc vào một hàng đợi ưu tiên theo tiêu chuẩn trọng số nhỏ nhất. Một trong các cấu trúc dữ liệu thuận lợi cho tiêu chuẩn này là cấu trúc đống (với phần tử có trọng số nhỏ nhất nằm trên đỉnh của đống).

Mã giả

Trong đoạn mã giả dưới đây ta dựa trên một mảng các ký hiệu có tần suất tương ứng là

Tạo hàng đợi bằng đống (heap)

Ta tạo một đống trên cơ sở sắp xếp lại các chỉ số của A và W. Ta lưu trữ đống dưới dạng mảng, ký hiệu nó là Heap[1..n]. Trước hết đưa chỉ số của các chữ cái theo thứ tự ban đầu vào mảng Heap[1..n] với Heap[i]=i. với mọi i=1..n.

Procedure DownHeap(List W,Int k,Int Count)
{
Int i:=k, v:=W(Heap(k)), j 

While 2*i<=Count {
j:=2*i
if j+1<= Count and W(Heap(j+1))>W(Heap(j)) then j:=j+1
if W(Heap(j))< v then Heap(i):=Heap(j)
else break 
i:=j
Heap(j):=Heap(k)
}
}
Procedure MakeHeap(List W,Int n)
{
Int k 
For k:=int(n/2) downto 1 {
DownHeap (W,k,n)
}
}

Xây dựng cây Huffman

Ta sẽ lưu trữ cấu trúc của cây mã Huffman vào một mảng. Cây Huffman gồm n lá mỗi lá chứa chỉ số của chữ cái tương ứng. Mỗi lần ghép 2 cây thành một ta phải thêm một đỉnh, như vậy cây biểu diễn mã Huffman gồm 2.n-1 đỉnh. Ta ký hiệu cây này là Huff[1..2n-1]. Vì mỗi gốc mới bổ sung đều có trọng số nên ta mở rộng mảng W[1..n] các trọng số thành mảng W' [1..2n-1]. Gọi m là số đỉnh của cây sẽ xây dựng. lúc đầu ta có n lá, đỉnh bổ sung lần đầu sẽ là n+1, lần thứ 2 là n+2,... Khi lấy ra hai ký tự có tần số nhỏ nhất chẳng hạn ký tự thứ i làm con trái và ký tự thứ j làm con phải của đỉnh mới bổ sung có chỉ số m ta đặt Huff[i]=-m, Huff[j]=m.

Procedure MakeTreeHuffman(List W,Int n)
{
List Heap,Huff 
Int i,j,count:=n,m:=n
MakeHeap(W,n) 
 While Count >1 {
i:=Heap(1)
Heap(1):= Heap(count)
Count:=Count-1
DownHeap(W,1,Count)
j:=Heap(1)
m:=m+1 
Huff(i):=-m
Huff(j):=m
W(m):=W(i)+W(j)
Heap(1):=m
DownHeap(W,1,Count) 
} 
Return Huff
}

Xây dựng bộ mã

Sau khi cấu trúc của cây Huffman được lưu vào mảng Huff ta dễ dàng xây dựng mảng Code[1..n] cho bộ mã nhị phân tiền tố tối ưu của các ký tự A[1..n].

Procedure CodingHuffman(List Huff, n){
Int k:=1,j
 While k<=n {
Code(k):=""
j:=Huff(k)
While Abs(j)<=2*n-1 {
 If j>0 then Code(k)="1"+Code(k) 
 else Code(k)="0"+Code(k)
j:=Huff(abs(j)) 
} 
k:=k+1  
} 
Return Code
}

Nén file bằng mã Huffman

Trong các bước trên, giả sử đã xây dựng được bộ mã Huffman của 256 ký hiệu có mã ASCII từ 0 đến 255 chứa trong mảng Code[1..256]. Việc nén file có thể phân tích sơ bộ như sau:

  1. Đọc từng byte của file cần nén cho đến khi hết tệp,
  2. Chuyển theo bộ mã thành xâu nhị phân,
  3. Ghép với xâu nhị phân còn dư từ bước trước,
  4. Nếu có đủ 8 bit trong xâu thì cắt ra tám bít đầu tiên ghi vào tệp nén,
  5. Nếu đã hết tệp cần nén thì dừng...

Xem thêm

Tham khảo

Liên kết ngoài

Read other articles:

Class of 17 diesel-electric locomotives that was used by Portuguese Railways This article does not cite any sources. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: CP Class 1930 – news · newspapers · books · scholar · JSTOR (May 2020) (Learn how and when to remove this template message) Class 1930Locomotive 1943 heading an Inter City passenger train at Évora stat...

 

يفتقر محتوى هذه المقالة إلى الاستشهاد بمصادر. فضلاً، ساهم في تطوير هذه المقالة من خلال إضافة مصادر موثوق بها. أي معلومات غير موثقة يمكن التشكيك بها وإزالتها. (ديسمبر 2018) هذه المقالة يتيمة إذ تصل إليها مقالات أخرى قليلة جدًا. فضلًا، ساعد بإضافة وصلة إليها في مقالات متعلقة بها...

 

Article 15 de la Constitution du 4 octobre 1958 Données clés Présentation Pays France Langue(s) officielle(s) Français Type Article de la Constitution Adoption et entrée en vigueur Législature IIIe législature de la Quatrième République française Gouvernement Charles de Gaulle (3e) Promulgation 4 octobre 1958 Publication 5 octobre 1958 Entrée en vigueur 5 octobre 1958 Article 14 Article 16 modifier L'article 15 de la Constitution de la cinquième République française fait partie...

Sia Ahmed Vefik Pasha e Isaac Pasha presiedettero il primo parlamento ottomano. La Prima era costituzionale (in turco Birinci Meşrutiyet Devri) dell'Impero Ottomano fu il periodo della monarchia costituzionale a partire dalla promulgazione della Costituzione ottomana del 1876 (Kanûn-ı Esâsî, che significa Legge fondamentale in turco ottomano, scritta da membri dei Giovani ottomani) che ebbe inizio il 23 dicembre 1876 e durò fino al 14 Febbraio 1878.[1][2] Questi gio...

 

PrimatAmfilohijePhD, Th.DMetropolitan Montenegro dan PesisirMetropolitan Amfilohije pada 2017Nama asalАмфилохијеGerejaGereja Ortodoks SerbiaKeuskupanMontenegro dan PesisirAwal masa jabatan30 Desember 1990Masa jabatan berakhir30 Oktober 2020PendahuluDanilo IIIPenerusJoanikije IIInformasi pribadiNama lahirRisto RadovićLahir(1938-01-07)7 Januari 1938Bare Radovića Banovina Zeta, Kerajaan Yugoslavia(sekarang Montenegro)Wafat30 Oktober 2020(2020-10-30) (umur 82)Podgorica, Montenegr...

 

This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these template messages) This article contains content that is written like an advertisement. Please help improve it by removing promotional content and inappropriate external links, and by adding encyclopedic content written from a neutral point of view. (January 2023) (Learn how and when to remove this template message) This article does not cite any sources. Ple...

Sandbox video game and game creation system For the PlayStation port of the 1997 video game, see Dreams to Reality. 2020 video gameDreamsDeveloper(s)Media MoleculePublisher(s)Sony Interactive EntertainmentDirector(s)Mark HealeyDesigner(s)Mark HealeyJohn BeechChristophe VilledieuSteve BelcherProgrammer(s)Alex EvansDavid SmithArtist(s)Kareem EttouneyFrancis PangJon EckersleyEmilie StabellMaja-Lisa KehletPlatform(s)PlayStation 4Release14 February 2020Genre(s)Game creation systemMode(s)Single-pla...

 

Ohio-class submarine For other ships with the same name, see USS Alabama. USS Alabama (SSBN-731) USS Alabama (SSBN-731) History United States NameAlabama NamesakeState of Alabama Ordered27 February 1978 BuilderGeneral Dynamics Electric Boat, Groton, Connecticut Laid down14 October 1980 Launched19 May 1984 Sponsored byMrs. Barbara E. Dickinson Commissioned25 May 1985 HomeportBangor, Washington Motto Audemus Jura Nostra Defendere (We dare defend our rights) Statusin active service Badge General...

 

Suburb of Perth, Western AustraliaAubin GrovePerth, Western AustraliaAubin Grove Sport and Community FacilityCoordinates32°10′08″S 115°51′50″E / 32.169°S 115.864°E / -32.169; 115.864Population6,786 (SAL 2021)[1]Established2003Postcode(s)6164Area2.5 km2 (1.0 sq mi)[2]LGA(s)City of CockburnState electorate(s)KwinanaFederal division(s)Fremantle Suburbs around Aubin Grove: Success Atwell Banjup Hammond Park Aubin Grove Banju...

مؤسسة الدراسات الفلسطينية الاختصار (بالإنجليزية: IPS)‏  البلد لبنان  المقر الرئيسي بيروت تاريخ التأسيس 1963 الموقع الرسمي الموقع الرسمي  الإحداثيات 33°53′12″N 35°29′08″E / 33.886694444444°N 35.485555555556°E / 33.886694444444; 35.485555555556   تعديل مصدري - تعديل   مؤسسة الدراسات الفل...

 

Politics of Chile Executive President (list) Gabriel Boric Ministries National Congress Senate Chamber of Deputies Judiciary Supreme Court Election Certification Court Law Constitution Constitutional Convention Administrative divisions Regions Provinces Communes Recent elections Political parties Recent elections and referendums General: 201320172021 Presidential: 2005–062009–10 Legislative: 20052009 Local: 20082012 Referendums: 198920202022 Constitutional convention: 20212023 Independent...

 

This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these template messages) This article may contain an excessive amount of intricate detail that may interest only a particular audience. Please help by spinning off or relocating any relevant information, and removing excessive detail that may be against Wikipedia's inclusion policy. (July 2023) (Learn how and when to remove this message) This article appears to be s...

Sub-discipline of civil engineering concerned with the flow and conveyance of fluids Not to be confused with Hydrologic engineering. Hydraulic Flood Retention Basin (HFRB) View from Church Span Bridge, Bern, Switzerland Riprap lining a lake shore Hydraulic engineering as a sub-discipline of civil engineering is concerned with the flow and conveyance of fluids, principally water and sewage. One feature of these systems is the extensive use of gravity as the motive force to cause the movement o...

 

此條目可参照英語維基百科相應條目来扩充。若您熟悉来源语言和主题,请协助参考外语维基百科扩充条目。请勿直接提交机械翻译,也不要翻译不可靠、低品质内容。依版权协议,译文需在编辑摘要注明来源,或于讨论页顶部标记{{Translated page}}标签。 《戚林八音》字韻書篇章 《戚林八音》(閩東語:戚林八音,平話字:Chék-lìng-báik-ĭng)是著名的福州韻書,刊行於十九�...

 

This article's lead section may be too short to adequately summarize the key points. Please consider expanding the lead to provide an accessible overview of all important aspects of the article. (January 2023) Human settlement in ScotlandKirkintillochScottish Gaelic: Cair Cheann Tulaich[1]Scots: Kirkintulloch[2]St Mary's Church in Kirkintilloch's CowgateKirkintillochShow map of East DunbartonshireKirkintillochLocation within ScotlandShow map of Glasgow council areaKirkintilloc...

ALARM dibawa oleh sebuah Panavia Tornado Peluru kendali anti-radiasi (bahasa Inggris: anti-radiation missile) adalah rudal yang dirancang untuk mendeteksi dan mengarah pada sumber emisi radio musuh. Biasanya cara ini dirancang untuk digunakan untuk melawan radar musuh, meskipun alat pengacau dan bahkan radio yang digunakan untuk komunikasi juga dapat diincar dengan cara ini.[1][2][3][4] Udara ke darat HARM terpasang pada sebuah F/A-18C Hornet Angkatan Laut ...

 

German dramatist (1813–1837) This article includes a list of general references, but it lacks sufficient corresponding inline citations. Please help to improve this article by introducing more precise citations. (September 2018) (Learn how and when to remove this message)Georg BüchnerPencil drawing of Büchner, c. 1835BornKarl Georg Büchner(1813-10-17)17 October 1813Riedstadt, Grand Duchy of HesseDied19 February 1837(1837-02-19) (aged 23)Zürich, SwitzerlandOccupationDramatistA...

 

この記事は検証可能な参考文献や出典が全く示されていないか、不十分です。 出典を追加して記事の信頼性向上にご協力ください。(このテンプレートの使い方)出典検索?: 小原鉄心 – ニュース · 書籍 · スカラー · CiNii · J-STAGE · NDL · dlib.jp · ジャパンサーチ · TWL (2015年8月)  凡例小原鉄心 時代 江戸時代末期(幕末)か�...

Spanish folk customs expert, Carlist politician and soldier In this Spanish name, the first or paternal surname is Baleztena and the second or maternal family name is Ascárate. Ignacio Baleztena AscárateBornIgnacio Baleztena Ascárate1 April 1887Pamplona, SpainDied2 September 1972(1972-09-02) (aged 85)Pamplona, SpainNationalitySpanishOccupationself-government officialKnown forPamplona iconPolitical partyTraditionalist Communion Ignacio Baleztena Ascárate (1887–1972) was...

 

Place in Fejér, HungaryCsókakőMedieval castle in Csókakő FlagCoat of armsCsókakőLocation of CsókakőCoordinates: 47°21′12″N 18°16′23″E / 47.35333°N 18.27312°E / 47.35333; 18.27312Country HungaryCountyFejérGovernment[1] • MayorFűrész Györg (Fidesz)Area[2] • Total10.92 km2 (4.22 sq mi)Population (2024)[3] • Total1,578 • Density140/km2 (370/sq mi)T...