哈夫曼壓縮

2021-09-02 06:39:52 字數 1679 閱讀 7888

[size=large] 此文主要分析的是哈夫曼壓縮的重點包括統計字元頻率,建哈夫曼樹,生成碼表。哈夫曼壓縮是最常用的一種靜態無痕壓縮。

以前也學習過哈夫曼的演算法結構,但是沒有自己去寫**實現,這次再學習了一遍,更加深刻理解哈夫曼壓縮的原理,如何真正實現檔案的壓縮節省記憶體資源。下面梳理下我的**和分析邏輯。

第一步是開啟檔案,讀取檔案流,統計文字頻率。

方法是讀取檔案內容,根據每個字元有唯一的位元組,儲存在長度為256的陣列中。可將字元和頻率繫結為乙個節點類node,所有節點類的物件儲存在佇列中。[/size]

/*

* 統計頻率

*/private static mylistcountfre(string path) throws ioexception

// 關閉檔案輸入流

fis.close();

mylistl = new mylist();

// 遍歷陣列,列印並儲存

for (int i = 0; i < bytearray.length; i++)

}return l;

}

[size=large] 第二步是排序。

根據字元所對應的頻率由小到大進行排序,可用選擇排序演算法。 [/size]

/*

* 排序

*/private static void sort(mylistlist)

// 交換

if (i != min)

}}

[size=large]第三步是構建哈夫曼二叉樹。

依次取出排好序的節點,每次取出前兩個生成乙個父節點,再將父節點新增到佇列中,這裡我將生成父節點的過程寫在另乙個函式creathfm裡,方便理解邏輯。[/size]

/*

* 構建哈夫曼二叉樹

*/private static node creat(mylistlist)

//根節點

node root = list.get(0);

return root;

}private static node creathfm(node left, node right)

[size=large] 第四步是給每個字元編碼,生成碼表。

用遞迴遍歷的方法生成每乙個字元的編碼,左0右1,並繫結字元儲存,即新建乙個類,依次儲存到佇列中。[/size]

/*

* 計算編碼

*/private static void creatcode(node root, string str) else

}

[size=large]

在以上**中所有的方法的引數輸入由上乙個方法的返回決定,更加方便梳理邏輯,查錯。

構造方法及主函式,其中主函式中測試檔案中的內容為string[/size]

public hfmtree(string path) throws ioexception 

/** 主函式

*/public static void main(string args) throws ioexception

[size=large]測試結果[/size]

[img]

哈夫曼壓縮

哈夫曼演算法 huffman 演算法是一種基於統計的壓縮方法。它的本質就是對文字檔案中的字元進行重新編碼,對於使用頻率越高的字元,其編碼也越短。但是任何2 個字元的編碼,是不能出現向前包含的。也就是說字元a 假設為00 的編碼的前段,不可能為字元b 則b的編碼不可能為001 因為這裡b 的編碼中包含...

哈夫曼壓縮

哈夫曼壓縮 哈夫曼壓縮是無失真壓縮的一種,一般用來壓縮文字和程式檔案。壓縮步驟 將要壓縮的檔案乙個乙個位元組地讀出來,統計每個位元組出現的次數 作為該葉子節點的權值 構建哈夫曼樹,採用優先佇列。遍歷哈夫曼樹,得到每乙個葉子節點的哈夫曼編碼。左0右1,得到的是01字串 將不足八位的01字串補0使其達到...

哈夫曼壓縮

將形成的二叉樹的左節點標0,右節點標1。把從最上面的根節點到最下面的葉子節點路徑中遇到的0,1序列串起來,得到各個符號的編碼。可以看到,符號只能出現在樹葉上,任何乙個字元的路徑都不會是另一字元路徑的字首路徑,這樣,字首編碼也就構造成功了。這樣一棵二叉樹在資料結構課程中稱之為huffman樹,常用於最...