哈夫曼編碼 POJ 1521

2021-10-08 05:59:05 字數 2618 閱讀 8545

第一篇文章,格式無要求。

哈夫曼編碼是一種根據詞頻變化的變長二進位制編碼方式,多用於壓縮演算法(實踐中用的也不多,雖然最優但比較古老了)。作為乙個比較基礎的數學原理,其思想多用於計算機的演算法程式設計實踐中。

詳見:哈弗曼編碼的實現

輸入:大寫字串+下劃線的集合,下劃線代表空格。

輸出: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 cmp

}// return true表示a的優先順序小於b的優先順序,a放在b後

priority_queue插入:queue.push();

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,然後分別找到權值最小的兩個點,生成 乙個新的節點加入該陣列中,將這兩個最小的點從陣列中刪除一直這樣迴圈,直到找不到兩個沒有父節點的點為止,就 ...