哈夫曼編碼是廣泛地用於資料檔案壓縮的十分有效的編碼方法。其壓縮率通常在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...