POJ1521 哈夫曼編碼,求最優WPL

2021-08-13 18:28:50 字數 1610 閱讀 8525

poj1521---哈夫曼編碼

題目描述

輸入乙個字串,長度不超過

100,僅由大寫字母和下劃分組成。求用最好的字元編碼方式,令總長度最小。

輸入

多組資料,每組資料在一行上輸入乙個字串,格式如前所述

當遇到end時,表示輸入結束

輸出

對應每個輸入,在一行上輸出

3個資訊:首先是每個字母按固定長度

8bit

編碼,字串的總長度,然後是按最優編碼的總長度,最後是前者對後者的比率,保留

1位小數。

樣例輸入

aaaaabcd

the_cat_in_the_hat

end樣例輸出

64 13 4.9

144 51 2.8

方法一:

直接建立哈夫曼樹,然後求wpl。

方法二:

舉個栗子:abbccc

權值分別為1,2,3。

先把a,b,生成乙個樹,此時a對應的編碼為0,b為1,abb則為011,為三位長度,再把此樹和c合併的時候,a,b編碼長度都增加了1,此時a為00,b為01,abb編碼長度增加的長度就是1+2(也就是第一次合併那個樹的權值)。

所以用這種思想可以不用去建哈夫曼樹,直接用優先佇列去存權值,每次把兩個最小的權值加起來(a+b),加在sum上,然後再把(a+b)壓入佇列。

方法二是參考的網上的解法,感覺不好想,或者是其他思想?反正法1也很直接。

#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef

struct hufnode *huf;

struct cmp

};int wpl(huf t, int depth)

int main()

int sum = 0;

if (q.size() == 1) //只有一種字元。

else

t = q.top(); q.pop();

sum = wpl(t, 0);

} printf("%d %d %.1f\n", 8 * s.size(), sum, (double)8.0 * s.size() / double(sum));

} return 0;

}

#include#include#include#include#include#include#include#include#includeusing namespace std;

int main()

q.pop();

printf("%d %d %.1f\n", 8 * s.size(), sum, (double)8.0 * s.size() / double(sum));

} return 0;

}

哈夫曼編碼 POJ 1521

第一篇文章,格式無要求。哈夫曼編碼是一種根據詞頻變化的變長二進位制編碼方式,多用於壓縮演算法 實踐中用的也不多,雖然最優但比較古老了 作為乙個比較基礎的數學原理,其思想多用於計算機的演算法程式設計實踐中。詳見 哈弗曼編碼的實現 輸入 大寫字串 下劃線的集合,下劃線代表空格。輸出 ascii編碼所需2...

Poj 1521 ,哈夫曼編碼

這裡,網上有很多部落格都有寫,很多人沒有建樹,直接就是求一下這個哈夫曼編碼的長度,的確很巧妙,我也用的這個方法,但是,幾乎所有部落格都沒有解釋sum a b 這個的原因。也許是我太菜了吧,腦子轉不過來,好久才想通。比如說b,c,d出現2次,bc組成乙個新的節點,4 2 6,組成乙個新的節點6,6 a...

poj 1521Entropy(哈弗曼編碼)

今天上機課寫了這道題,已經是上上週留的作業了,有幾天沒刷演算法題了,哈弗曼編碼,貪心求解。思路 就是建立乙個二維陣列,乙個儲存權值w,另乙個儲存父節點座標f,然後分別找到權值最小的兩個點,生成 乙個新的節點加入該陣列中,將這兩個最小的點從陣列中刪除一直這樣迴圈,直到找不到兩個沒有父節點的點為止,就 ...