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

2021-07-24 08:48:11 字數 1617 閱讀 2022

time limit: 1000ms

memory limit: 65536kb

submit

statistic

problem description

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

編碼,哈夫曼編碼

(huffman coding)

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

20%~

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

ascii

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

input

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

output

對應字元的

ascii

編碼長度la,

huffman

編碼長度lh和

la/lh的值(

保留一位小數

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

example input

aaaaabcd

the_cat_in_the_hat

example output

64 13 4.9

144 51 2.8

hint

author

先說一下哈夫曼編碼:

設某信源產生有五種符號u1、u2、u3、u4和u5,對應概率p1=0.4,p2=0.1,p3=p4=0.2,p5=0.1。首先,將符號按照概率由大到小排隊,編碼時,從最小概率的兩個符號開始,可選其中乙個支路為0,另一支路為1。這裡,我們選上支路為0,下支路為1。再將已編碼的兩支路的概率合併,並重新排隊。多次重複使用上述方法直至合併概率歸一時為止。可能出現兩者雖平均碼長相等,但同一符號可以有不同的碼長,即編碼方法並不唯一,其原因是兩支路概率合併後重新排隊時,可能出現幾個支路概率相等,造成排隊方法不唯一。一般,若將新合併後的支路排到等概率的最上支路,將有利於縮短碼長方差,且編出的碼更接近於等長碼。

這個題最簡單的就是用stl優先佇列來做,由於平時的測試不能用stl的固定模板,所以手寫了乙個陣列+快排模擬的優先佇列

#include #include #include using namespace std;

void qsort(int a, int low, int high) //從小到大快排

a[i] = x;

qsort(a,low, i - 1);

qsort(a,i + 1, high);

}int main()

qsort(q, 0, top- 1); //對佇列快排

while(top != rear)

}printf("%d %d %.1lf\n", sum1, sum2, 1.0 * sum1 / sum2);

}return 0;

}

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

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 也是一種編碼方式,它是可變字長編碼。該方法完全依據字元出現概率來構造出平均長度最短的編碼,稱之為最優編碼。哈夫曼編碼常被用於資料...