哈夫曼編碼C 實現(優先佇列)(map對映)

2021-10-07 03:58:00 字數 2228 閱讀 9075

哈夫曼樹是帶權路徑最短的最優二叉樹,即權值越小的結點里根節點越遠反之則越近。

借助優先佇列,初始時,將所有的結點壓入優先佇列,權值越小優先順序越高,每次取兩個優先順序最小的結點,將其作為新節點左右孩子節點,再將新節點壓入優先佇列,再次選取兩個權值最小的結點,直到優先佇列中只剩下乙個結點,此節點作為根節點,哈夫曼樹建立完成。

void huffmantree::

createhuffmantree

(vectorint, string>

>

& v)

node *left,

*right;

while

(true

) q.

push

(new

node(""

, left-

>frequency + right-

>frequency, left, right));

}}

規定左子樹編碼』0』,右子樹編碼』1』,遞迴地進行編碼,遇到葉子節點則在map建立《編碼,值》對映,

void huffmantree::

huffmanencode

(node *p)if(

!p->leftchild &&

!p->rightchild)

else

}

根據哈夫曼樹的構造,不定長編碼,任一編碼一定不其他任意編碼的字首碼,假定輸入編碼均為合法,遍歷編碼序列,對於每個子編碼序列,在map中檢視編碼是否存在,若存在則輸出並將子串行清空,繼續遍歷,直到遍歷編碼序列結束。

void huffmantree::

huffmandecode

(string code)

}}

/*

author : eclipse

email : [email protected]

time : sat jun 13 11:50:26 2020

*/#include

using

namespace std;

struct node };

struct compare };

class

huffmantree

;huffmantree::

huffmantree

(vectorint, string>

> v)

void huffmantree::

huffmanencode

(node *p)if(

!p->leftchild &&

!p->rightchild)

else

}void huffmantree::

huffmandecode

(string code)}}

void huffmantree::

createhuffmantree

(vectorint, string>

>

& v)

node *left,

*right;

while

(true

) q.

push

(new

node(""

, left-

>frequency + right-

>frequency, left, right));

}}intmain

(int argc,

char

const

*ar**)

huffmantree *huffmantree =

newhuffmantree

(v);

string code;

cin >> code;

huffmantree-

>

huffmandecode

(code)

;return0;

}

876 huffman

616 tree

427 create

583 successfully

929 !

-1010011011110

huffman tree create successfully !

優先佇列實現 哈夫曼編碼

用到了優先佇列的知識點,還有dfs演算法。優先佇列主要是為了查詢最小權重樹的時候方便查詢,不用耗費很多的時間從已經產生的樹種依次查詢,具體實現看 dfs主要是用來遍歷樹從而拿到每個字元的編碼,具體實現看 include include include includeusing namespace s...

哈夫曼編碼的C 實現(優先佇列 貪心)

哈夫曼編碼就是不斷地取數列中最小的兩個,合併,再新增到數列中,迴圈。利用了貪心的思想。在c 實現的時候可以用到優先佇列 priority queue,這個方便的東西。這個優先佇列,會自己進行排序,每次加進去乙個數,都會更新,降序排列或公升序排列。以公升序排列為例,更新過後的隊首元素就是數列中最小的數...

優先佇列實現哈夫曼編碼(貪心法)

構造哈夫曼樹及輸出哈夫曼編碼,優先佇列構造最小堆實現 windows下輸入結束方法 enter,ctrl z,enter 執行結果如下 遍歷哈夫曼樹,列印哈夫曼編碼 void createhuffcode treenode root 如果是葉子結點,列印 if root lchild root rc...