基於C語言利用哈夫曼樹實現檔案壓縮的問題

2022-09-24 20:00:11 字數 1550 閱讀 5745

具有n個權值的n個葉子結點,構造出乙個二叉樹,使得該樹的帶權路徑長度(wpl)最小,則稱此二叉樹為最優二叉樹,也稱為哈夫曼樹(huffman tree)。

注意:哈夫曼樹是帶權路徑長度最短的樹,且權值越大的葉子結點離根結點越近。

哈夫曼編碼是一種編碼方式,又稱「霍夫曼編碼」,其是可變字長的編碼(vcl)的一種,是由霍夫曼於2023年提出的一種編碼方式,有時被稱為最佳編碼,一般稱為huffman編碼。

那麼我們為什麼要使用哈夫曼編碼進行壓縮?

首先原因在於,傳統壓縮方式中,字元的編碼是以等字長的方式進行壓縮,相比於哈夫曼編碼的可變字長而言壓縮率會降低。其次,傳統方式中可能會出現某些字元的編碼相同,存在二義性,相比於哈夫曼編碼的唯一性。可以大大提高正確性。

通過已經構造的哈夫曼樹,結點左分支記為二進位制數「0」,結點右分支記為二進位制數「1」。從根結點向下到該葉子結點路途經過的數字拼接成為的編碼即為該字元的哈夫曼編碼。現通過以下圖例進行演示。

此時各字元對應的哈夫曼編碼可表示為:

a:00        b:01        c:1

存在後執行接下來的步驟,不存在提示使用者,效果圖如下

使用者輸入正確檔案路徑且存在時使用檔案輸入流讀取檔案,將檔案放於乙個字元陣列中(注意字元陣列開闢空間應足夠大)。統計出現的字元及其出現的次數。

char ch;

while(feof(fp) == 0)

printf("\n");

for(i = 0; i < 1024; i++)

}注:由於後續會使用此哈夫曼編碼,為了方便獲取,這裡將求出的哈夫曼編碼放置於乙個二維陣列中。

createht(ht,node);

char strarr[256][256];

int aa,bb;

for(aa=0; aa<256;aa++)

for(bb=0;bb<256;bb++)

strarr[aa][bb]=-1;

for(k = 0;k < node;k++)

void createht(htnode *ht, int n)

} if(flag)

}}替換完成後的ijxzdeknz字元陣列使用輸出流寫入使用者輸入檔案路徑。

將檔案中每八位二進位制數轉換為十進位制數,再轉換為其對應的ascii碼值,最後不足八位的二進位制數以0補齊,實現檔案壓縮。

3.ijxzdeknz7.1 進製轉換方法

int retten(char str)

return ten;

}3.7.2 實現效果

最後為驗證是否實現壓縮,可通過計算檔案壓縮率來驗證。其中,壓縮率=原檔案位元組大小/壓縮後檔案大小。

int oldfilesize=getfilesize(path);

int newfilesize=getfilesize(gopath);

printf("\n");

printf("壓縮成功!,檔案已壓縮至%s\n",gopath);

printf("該檔案壓縮率為:%.2lf\n",(double)newfilesize/(double)oldfilesize);

注:注意計算壓縮率時的型別轉換

C語言哈夫曼樹和哈夫曼編碼的實現

哈夫曼樹是一類帶權路徑 wpl 最短的的樹。下面說一下實現 首先仍然是型別定義 typedef char huffmancode typedef structhtnode,huffmantree 選擇函式 void select huffmantree ht,int i,int s1,int s2 ...

哈夫曼樹與哈夫曼編碼(C 實現)

1 對給定的n個權值構成n棵二叉樹的初始集合f 其中每棵二叉樹ti中只有乙個權值為wi的根結點,它的左右子樹均為空。2 在f中選取兩棵根結點權值最小的樹作為新構造的二叉樹的左右子樹,新二叉樹的根結點的權值為其左右子樹的根結點的權值之和。3 從f中刪除這兩棵樹,並把這棵新的二叉樹同樣以公升序排列加入到...

哈夫曼樹 C 實現

include using namespace std define maxbit 10 define maxvalue 10000 define maxleaf 100 define maxnode maxleaf 2 1 定義哈夫曼樹編碼型別 typedef structcodetype 定義哈...