資料結構實驗之二叉樹六 哈夫曼編碼

2021-07-16 08:18:27 字數 1953 閱讀 7044

time limit: 1000ms   memory limit: 65536k  有疑問?點這裡^_^

字元的編碼方式有多種,除了大家熟悉的ascii

編碼,哈夫曼編碼

(huffman coding)

也是一種編碼方式,它是可變字長編碼。該方法完全依據字元出現概率來構造出平均長度最短的編碼,稱之為最優編碼。哈夫曼編碼常被用於資料檔案壓縮中,其壓縮率通常在

20%~

90%之間。你的任務是對從鍵盤輸入的乙個字串求出它的

ascii

編碼長度和哈夫曼編碼長度的比值。

輸入資料有多組,每組資料一行,表示要編碼的字串。

對應字元的

ascii

編碼長度la,

huffman

編碼長度lh和

la/lh的值(

保留一位小數

),資料之間以空格間隔。

aaaaabcd

the_cat_in_the_hat

64 13 4.9

144 51 2.8

這裡先講c++中使用stl優先佇列的方法模擬哈夫曼編碼。

用法:示例:將元素5,3,2,4,6依次push到優先佇列中,print其輸出。

1. 標準庫預設使用元素型別的《操作符來確定它們之間的優先順序關係。

priority_queue pq;
通過《操作符可知在整數中元素大的優先順序高。

故示例1中輸出結果為: 6 5 4 3 2

2. 資料越小,優先順序越高

priority_queue, greater >pq;
其中

第二個引數為容器型別。

第三個引數為比較函式。

greater

表示t類運算。

和**中的自定義cmp函式效果一樣。

函式物件

故示例2中輸出結果為:2 3 4 5 6

3. 自定義優先順序,過載比較符號

過載預設的 < 符號

struct node

int priority;

int value;

};

priority_queueqn;
這時,需要為每個元素自定義乙個優先順序。

注:過載》號會編譯出錯,因為標準庫預設使用元素型別的《操作符來確定它們之間的優先順序關係。

而且自定義型別的《操作符與》操作符並無直接聯絡。

#include#include#includeusing namespace std;

char a[10000];

int b[1000];

struct cmp

};int main()

;void creatht(tnode ht,char st) //建立哈夫曼樹

// for(int i=0; i

//

// if(!flag)

//

// }

int a[1000];

memset(a,0,sizeof(a));

for(int i=0; i

a[st[i]]++;

for(int i=0; i<130; i++)

if(a[i]!=0)

for(int i=j; i

else if(ht[k].w

}ht[i].w=ht[r].w+ht[l].w;

ht[i].l=l;

ht[i].r=r;

ht[l].p=i;

ht[r].p=i;

}}int print(tnode ht)

int main()

}

資料結構實驗之二叉樹六 哈夫曼編碼

time limit 1000ms memory limit 65536k 字元的編碼方式有多種,除了大家熟悉的ascii 編碼,哈夫曼編碼 huffman coding 也是一種編碼方式,它是可變字長編碼。該方法完全依據字元出現概率來構造出平均長度最短的編碼,稱之為最優編碼。哈夫曼編碼常被用於資料...

資料結構實驗之二叉樹六 哈夫曼編碼

time limit 1000ms memory limit 65536k 字元的編碼方式有多種,除了大家熟悉的ascii 編碼,哈夫曼編碼 huffman coding 也是一種編碼方式,它是可變字長編碼。該方法完全依據字元出現概率來構造出平均長度最短的編碼,稱之為最優編碼。哈夫曼編碼常被用於資料...

資料結構實驗之二叉樹六 哈夫曼編碼

time limit 1000ms memory limit 65536k 有疑問?點這裡 字元的編碼方式有多種,除了大家熟悉的ascii 編碼,哈夫曼編碼 huffman coding 也是一種編碼方式,它是可變字長編碼。該方法完全依據字元出現概率來構造出平均長度最短的編碼,稱之為最優編碼。哈夫曼...