請設計乙個演算法,給乙個字串進行二進位制編碼,使得編碼後字串的長度最短。
哈夫曼編碼,權為各個字元出現的頻率,再借助小根堆計算。
result=詞頻1*深度1+詞頻2*深度2…
詞頻可以借助雜湊表統計,而深度可以通過小根堆來實現
比如:
mt-tech-team
雜湊表統計完字元出現的次數後,為1,1,1,2,2,2,3
找出權最小的2個(1,1),生成新的結點2(重複此步驟)
1,2,2,2,2,3(res=2)
2,2,2,3,3(res=2+3=5)
2,3,3,4(res=5+4=9)
3,4,5(res=9+5=14)
5,7(res=14+7=21)
12(res=21+12=33)
這樣做的依據是可以計算每個權在樹中的深度。
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
int main()
int x1, x2;
int res = 0;
while (--cnt > 0)
cout
<< res << endl;
}return
0;}
哈夫曼編碼
哈弗曼編碼幾乎是所有壓縮演算法的基礎,其實這個演算法並不複雜,簡單的理解就是,如何用更短的bit來編碼資料。我們知道普通的編碼都是定長的,比如常用的ascii編碼,每個字元都是8個bit 字元編碼 a00101001 b00101010 c00101011 這樣,計算機就能很方便的把由0和1組成的資...
哈夫曼編碼
哈夫曼編碼 裝載請註明淶源 chengyaogen.blog.chinaunix.net 前面一節我們知道了,怎樣去建立乙個哈夫曼樹,這一節我們來看看哈夫曼編碼。思想 得到哈夫曼樹後,自頂向下按路徑編號,指向左節點的邊編號0,指向右節點的邊編號1,從根到葉節點的所有邊上的0和1連線起來,就是葉子節點...
哈夫曼編碼
前面一節我們知道了,怎樣去建立乙個哈夫曼樹,這一節我們來看看哈夫曼編碼。思想 得到哈夫曼樹後,自頂向下按路徑編號,指向左節點的邊編號0,指向右節點的邊編號1,從根到葉節點的所有邊上的0和1連線起來,就是葉子節點中字元的哈夫曼編碼。下圖體現了哈夫曼編碼的過程 哈夫曼樹結點 typedef struct...