字元編碼(哈夫曼編碼)

2021-08-02 09:37:59 字數 761 閱讀 6734

請設計乙個演算法,給乙個字串進行二進位制編碼,使得編碼後字串的長度最短。

哈夫曼編碼,權為各個字元出現的頻率,再借助小根堆計算。

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...