《演算法導論》筆記 霍夫曼(Huffman)樹構造

2021-06-16 04:52:27 字數 1247 閱讀 8387

huffman code是應用很廣泛的一種文字壓縮編碼方式。它的原理就是用不等長的編碼來表示不同出現頻率的字元。出現頻率高的字元,就用比較短的編碼來表示,出現頻率低的,就是較長的編碼來表示。如下表: 

圖中是乙個檔案中出現的字元(abcdeft)以及相應的出現頻率。如果使用等長編碼方式,則每個字元都要用三位來表示,總的長度就是300個bit,如果用變長碼來表示,則總長度為224個bit。(對於出現頻率最高的a,我們就用乙個0來表示它,這樣,可以節省很多空間)。huffman編碼的壓縮比通常都在20%-90%。

huffman編碼是一種字首編碼方式,所謂字首編碼,即,在編碼集合中,沒有任何乙個編碼是另乙個編碼的字首。例如,用0來表示a, 用10表示b,那麼a的編碼就不是b的編碼的字首部分。(其實把這種編碼叫"字首編碼"實在是彆扭,意思剛好相反了。不過《演算法導論》一書也提出這種說法,"字首編碼"已經是乙個通用的叫法了,所以只好一直沿用下去)

乙個字元集合的最優壓縮編碼方案總是可以用字首編碼表示出來。字首編碼最大的好處就是沒有二義性,當我們順序讀取編碼檔案時,只要有編碼與字元匹配,就可以直接把讀出來的資料翻譯成相應的字元,然後再繼續後面的解碼。因為字首編碼決定了乙個已經匹配的編碼,決不可能是另乙個編碼的一部分,所以可以直接確定對應的字元是什麼。

使用huffman編碼的時候,一般要生成對應文字的編碼集合(huffman樹),然後再將文字的每個字元相應都轉成壓縮碼。解碼時也要依賴於對應的huffman樹,huffman樹是滿二叉樹(即除了葉節點之外,內部節點都有兩個子節點)。如上面圖中的字元以及出現頻率來講,其中的一種huffman樹可能如下圖所示:

在解碼時,先獲取相應的壓縮碼,然後每次取一位,從樹部開始查詢,如果取出的位是0,就向左子節點移動,如果取出的位是1,則向右子節點移動,然後再取下一位,一直到葉節點為止。每個葉節點都是乙個相應的字元。由於huffman編碼是字首編碼,所以到達葉節點時可以確定對應這個壓縮碼的字元就是當前所在的葉節點了。然後再取後面的壓縮碼,繼續前面過程,最終就可以將整個檔案都解碼出來。

huffman樹的構造:

huffman樹的構造可以採用貪婪演算法。用貪婪演算法解決的問題,一般要滿足兩個條件:

《演算法導論》筆記彙總

列表裡沒有的,或者是純屬理論,不適合寫,比如第1 5章 或者是我也不怎麼明白的,比如斐波那契堆中抽取最小結點的平攤代價分析 還有沒看的,比如數論和np完全性等。陸續看了四個月,有些理解的還不是很深,筆記彙總到這裡。如果有問題,可以郵件交流。第六章 堆排序 堆排序 第七章 快速排序 四種快速排序 快速...

《演算法導論》筆記 前言

演算法導論 應該是每乙個程式設計師都應該看的經典吧。不過現在這個時代,設計重於資料結構和演算法,乙個普通程式設計師,只要會用api sdk,再學一點軟體工程思想,就足夠應付日常工作了。在很多人眼中,演算法的研究只是一小撮人做的事,他們為我們提供底層工具,我們在其基礎上搭建面對使用者的應用程式,而應用...

演算法導論筆記 1

略過 2.1 插入排序這種方法類似於數學歸納法,只不過,數學歸納法是無限迭代的,而該方法在for或者while語句停止時,歸納停止,運用這種方法,可以幫我們有條理的證明某演算法在for或while迴圈上正確完備的達到了我們的期望。2.2 分析演算法 演算法的複雜度通常有以下幾種情況 2.3 設計演算...