資料有一種結構叫做二叉樹,即每個節點至多含有兩個子樹,左子樹和右子樹。生活中類似樹結構的東西有很多,如:生活中的族譜,計算機編碼!
對於給定n個權值作為n個葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹。哈夫曼樹可以用來編碼資料,如:將字串形式的資料編碼為二進位制的數進行輸出,利用哈夫曼樹進行資料壓縮,對資料進行加密。
哈夫曼實現壓縮:
哈夫曼壓縮是個無損的壓縮演算法,一般用來壓縮文字和程式檔案。哈夫曼壓縮屬於可變**長度演算法一族。
壓縮的時候如果我們遇到了字串,我們可以把字串中的每個字元出現的次數作為字元的權值,將權值編碼轉化為二進位制編碼即0或1串,就完成了壓縮,下面是將字串轉化為二進位制編碼的詳細**:
public class hfm
/*** 求得字元c出現的次數
* @param str 字串
* @param c
* @return
*/public int getcount(string str,char c)
}} }
/*** 建立哈夫曼樹
* @param str 字串
* @return
*/public node createhfmtree(string str){
node nodes=this.tonodearray(str);//首先轉化為節點陣列
while(nodes.length>1){//利用迴圈將節點連線
this.sort(nodes);//首先要進行排序
node n1=nodes[0];
node n2=nodes[1];
node n3=new node();
n3.count=n1.count+n2.count;
n3.lift=n1;
n3.right=n2;
node newnode =new node[nodes.length-1];//建立乙個新的節點陣列
newnode[0]=n3;
for(int i=0;i在此過程中的邏輯順序為:**建立哈夫曼樹——〉 需要字串的權值(
1.要有求字串權值的方法(本例中為getcount方法)
2.要將權值整型陣列轉化為節點陣列,權值作為節點的屬性(本例中為tonodearray方法)
3.要將節點陣列按權值排序(本例中為sort方法))——〉將節點連線起來(本例中為
createhfm)——〉列印出編碼(本例中為printhfmtree)
哈夫曼編碼 哈夫曼樹
1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....
哈夫曼樹 哈夫曼編碼
定義從a結點到b結點所經過的分支序列為從a結點到b結點的路徑 定義從a結點到b結點所進過的分支個數為從a結點到b結點的路徑長度 從二叉樹的根結點到二叉樹中所有結點的路徑長度紙盒為該二叉樹的路徑長度 huffman樹 帶權值路徑長度最小的擴充二叉樹應是權值大的外界點舉例根結點最近的擴充二叉樹,該樹即為...
哈夫曼編碼 哈夫曼樹
哈夫曼樹是乙個利用權值進行優化編碼的乙個比較奇怪的樹,他的實現比較簡單,用途也比較單一。哈夫曼樹的實現,實現要求 通過哈夫曼樹可以保證在編碼過程中不會出現例如 1000和100這樣的編碼規則,否則就會編碼失敗,因為1000和100在某些情況下的編碼會一模一樣。通過哈夫曼樹可以保證權值大的值進行編碼時...