第一篇文章,格式無要求。
哈夫曼編碼是一種根據詞頻變化的變長二進位制編碼方式,多用於壓縮演算法(實踐中用的也不多,雖然最優但比較古老了)。作為乙個比較基礎的數學原理,其思想多用於計算機的演算法程式設計實踐中。
詳見:哈弗曼編碼的實現
輸入:大寫字串+下劃線的集合,下劃線代表空格。
輸出:ascii編碼所需2進製長度 哈夫曼編碼後長度 壓縮率(前者除以後者),遇到end終結。
解題思路:重點在哈夫曼樹的實現。
講真,這哈夫曼用的比較簡單,本來想用正常的哈夫曼,後來還是簡化了。
ps:一些**沒優化,可以進一步改動
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
int n;
string s;
typedef
struct treenode;
struct cmp};
//node node[30];
int allsize;
intmain()
else}
map<
char
,int
>
::iterator iter = tmpmap.
begin()
; allsize =0;
node*
* node =
(node**)
malloc(30
*sizeof
(node*))
; priority_queue, vector>
, cmp> queue;
// 建立node,從0到allsize-1;
for(
; iter != tmpmap.
end(
); iter++
)// 合併,形成哈夫曼樹
// 使用優先佇列
int last, result =0;
while
(queue.
size()
>1)
if(result ==0)
cout << s.
size()
*8<<
" "<< result <<
" ";
printf
("%.1lf\n"
, s.
size()
*8.0
/result)
;free
(node[last]);
free
(node);}
return0;
}
哈夫曼編碼的原理,是最優字首編碼
stl使用:
map初始化:maptmpmap;
map查詢:map::iterator iter = tmpmap.find(「a」);
如果返回tmpmap.end()表示無,否則返回對應的元素,使用iter->first,iter->second來獲得前後元素。
map迭代:for(; iter != tmpmap.end(); iter++);
stl使用
priority_queue初始化:priority_queue, cmp>
其中int表示資料型別,vector表示佇列的容器,cmp表示比較方法,可以使用預設提供的less《資料型別》(降序)或greater《資料型別》(公升序);或者自定義。
自定義有兩種方式,一種是過載運算子<:
bool operator< (node a, node b)另一種是重寫仿函式:if (a.x == b.x) return a.y > b.y;
return a.x > b.x
// return true 表示a的優先順序比b小,放在b之後,本例中表示公升序排列。
struct cmppriority_queue插入:queue.push();}// return true表示a的優先順序小於b的優先順序,a放在b後
priority_queue頭部元素:queue.top();
priority_queue彈出隊頭元素:queue.pop();
注:queue使用堆來實現。
精度控制
使用的printf("%.2lf\n", result)來控制小數點後精度為2。
使用的cout << setiosflags(ios::fixed) << setprecision(2) << result; 保留2位小數。
使用cout << setprecision(3) << result; 保留3位有效數字。
哈弗曼編碼與資訊理論中的自資訊量,證明最優
哈夫曼編碼的圖論理解:樹的最短帶權路徑長度(wpl)
實際使用
Poj 1521 ,哈夫曼編碼
這裡,網上有很多部落格都有寫,很多人沒有建樹,直接就是求一下這個哈夫曼編碼的長度,的確很巧妙,我也用的這個方法,但是,幾乎所有部落格都沒有解釋sum a b 這個的原因。也許是我太菜了吧,腦子轉不過來,好久才想通。比如說b,c,d出現2次,bc組成乙個新的節點,4 2 6,組成乙個新的節點6,6 a...
POJ1521 哈夫曼編碼,求最優WPL
poj1521 哈夫曼編碼 題目描述 輸入乙個字串,長度不超過 100,僅由大寫字母和下劃分組成。求用最好的字元編碼方式,令總長度最小。輸入 多組資料,每組資料在一行上輸入乙個字串,格式如前所述 當遇到end時,表示輸入結束 輸出 對應每個輸入,在一行上輸出 3個資訊 首先是每個字母按固定長度 8b...
poj 1521Entropy(哈弗曼編碼)
今天上機課寫了這道題,已經是上上週留的作業了,有幾天沒刷演算法題了,哈弗曼編碼,貪心求解。思路 就是建立乙個二維陣列,乙個儲存權值w,另乙個儲存父節點座標f,然後分別找到權值最小的兩個點,生成 乙個新的節點加入該陣列中,將這兩個最小的點從陣列中刪除一直這樣迴圈,直到找不到兩個沒有父節點的點為止,就 ...