哈夫曼編碼最優字首碼的貪心演算法

2021-10-21 17:03:18 字數 1723 閱讀 4486

哈夫曼編碼是廣泛地用於資料檔案壓縮的十分有效的編碼方法。其壓縮率通常在20%~90%之間。哈夫曼編碼演算法用字元在檔案**現的頻率表來建立乙個用0,1串表示各字元的最優表示方式。

字首碼:對每乙個字元規定乙個0,1串作為其**,並要求任一字元的**都不是其他字元**的字首。這種編碼稱為字首碼。編碼的字首性質可以使解碼方法非常簡單;例如001011101可以唯一的分解為0,0,101,1101

最優字首碼的二叉樹總是一棵完全二叉樹,即樹中任意節點都有2個兒子,節點權重最小的節點在樹的最深處。

根據上述分析,完成如下要求:

設計乙個貪心演算法,用程式語言實現,求解最優字首編碼問題。

#include

#include

#include

typedef

struct

hfnode,

*hftree;

typedef

char

*hfcode;

//儲存哈弗曼編碼

void

select

(hftree *ht,

int n,

int*s1,

int*s2)

//選擇兩個parent為0,且weight最小的結點s1,s2

}for

(i=1

;i<=n;i++)}

}*s1=min;

for(i=

1;i<=n;i++)}

for(i=

1;i<=n;i++)}

}*s2=min;

}void

creathftree

(hftree *ht,

int*w,

int n)

//w存放n個權值

for(i=n+

1;i<=m;i++

)//非葉子結點的初始化

for(i=n+

1;i<=m;i++)}

void

code

(hftree *ht,hfcode *hc,

int n)

else

} hc[i]=(

char*)

malloc

((n-start)

*sizeof

(char))

;strcpy

(hc[i]

,&cd[start]);

//將cd複製編碼到hc

}free

(cd)

;for

(i=1

;i<=n;i++

)printf

("權值為%d的最優字首編碼為:%s\n",(

*ht)

[i].weight,hc[i]);

for(i=

1; i<=n; i++

) w+=(

*ht)

[i].weight*a[i]

; w=w/

100;

printf

("平均碼長為: %.2f\n"

, w);}

intmain()

creathftree

(&ht,w,n)

;code

(&ht,

&hc,n)

;}

執行結果:

貪心演算法之哈夫曼編碼

哈夫曼編碼簡介 舉例以及詳細說明 塊測試結果 二叉樹中有一種特別的樹 哈夫曼樹 最優二叉樹 其通過某種規則 權值 來構造出一哈夫曼二叉樹,在這個二叉樹中,只有葉子節點才是有效的資料節點 很重要 其他的非葉子節點是為了構造出哈夫曼而引入的!哈夫曼編碼是乙個通過哈夫曼樹進行的一種編碼,一般情況下,以字元...

貪心演算法 (哈夫曼編碼)HuffmanCode

哈夫曼編碼應用在於對於檔案的壓縮,壓縮效率是非常的高。實現哈夫曼編碼,得首先知道哈夫曼樹的形成過程是怎樣進行的 1 對於所要編碼的資料,首先得將它們中找到其中的最小的兩個位置合併成乙個小樹,節點的權值是兩者相加形成的 2 步驟1中得到的權值在進入原排列中,在此獲取新組合中的最小的兩個資料,在執行步驟...

演算法 貪心演算法 哈夫曼編碼 python

博主自己手擼的 若有有錯誤,感謝指出 直接上 目錄0 講義 0.1 二元字首碼 0.2 平均傳輸位數 0.3 偽碼 0.4 例項 計算平均位數 哈夫曼編碼 生成哈夫曼樹 主函式 哈夫曼編碼是資料結構常考知識點,對比以前c寫的 python真的簡單易懂。哈夫曼編碼,計算平均位數 def huffman...