Huffman編碼的實現

2021-04-12 18:51:06 字數 2706 閱讀 6518

這裡的huffman編碼就是離散數學中學的最優二叉樹,現在我們用c++來實現它。

首先考慮實現它使用的資料結構,當然這裡肯定使用二叉樹。其次就是儲存方式,對於樹一般情況是用間接儲存也就是鍊錶。但是二叉鍊錶不方便尋找雙親節點,這裡使用向量更好,對儲存空間的利用率也較高。

建立資料結構:

huffman樹中每個節點看成陣列中的乙個元素,它的屬性有:權(weight),字元(data) 。為了方便尋找雙親和孩子節點加入三個域parent ,lch ,rch。分別儲存雙親和左右孩子節點在陣列中位置下標。

然後再建立個類來操作huffman樹。

//huffman.h

#include 

<

string

>

using

std::

string

;class

huffmantree

*nodes;

intcodenum;

intnodenum;};

這裡,我在節點中又加了個code屬性,這個是每個字元的最後編碼。codenum是葉子節點數,也就是需要編碼的字元節點數。nodenum是總節點數。要讓外面那個類能操作node類,則需要宣告為它的友元函式。

huffman數建立的過程:

1. 根據給定的n個權值構成n棵二叉樹。

2. 從所有的二叉樹中選取兩個權值最小節點的構成乙個新的樹,這個樹的權值是兩個節點權值之和。

3. 重複2,直到只剩一棵樹為止。

下面是實現這個類的**:

//huffman.cpp

#include 

"huffman.h

"#include 

<

iostream

>

#include 

<

string

>

using

namespace

std;

huffmantree::huffmantree(

intnum,

intw):codenum(num)

for(

inti

=codenum;i

<

nodenum;i++)

}void

huffmantree::buildtree()

}void

huffmantree::select(

intsize,

int&

s1,int

&s2)

if(temp==1

)elses1=

i;temp++;

continue;}

if(nodes[i].weight

<

nodes[s2].weight)

elses2=

i;}}}

void

huffmantree::setcode()

}}void

huffmantree::display()

string

huffmantree::send(

char

*old)}}

return

newcode;

}string

huffmantree::get(

string

old)

else

}return

newcode;}

建構函式:用待編碼字元數和每個字元的權值來初始化。

根據節點個數在堆區建立陣列。

節點分兩種葉子節點(為編碼的字元)和非葉子節點,所以分開初始化。

build 函式:這個是根據huffman樹規則建立二叉樹。

select 函式:從節點陣列0到size的範圍內選取兩個權值最小的節點,下標放在s1,s2中。

setcode 函式:求出每個字元的編碼。

display 函式:顯示編碼。

send 函式:給定乙個字串,求出它的編碼。

get 函式:從得到的0、1串中翻譯出它原編碼。

編碼的過程就是從樹葉到樹根的路徑,而反編碼則是從樹根到樹葉的路徑。

最後給出乙個測試**: 

//the test file

#include 

<

iostream

>

#include 

<

string

>

#include 

"huffman.h

"using

namespace

std;

intmain()

;huffmantree*t

=new

huffmantree(

15,w);

t->

buildtree();

t->

setcode();

t->

display();

chars=

"aefbcgbam";

stringp=

t->

send(s);

cout

<<

p<<

endl;

cout

<<

t->

get(p)

<<

endl;}

最後說一點,操作字串在c++中,使用標準庫中的string模擬自己來撥弄指標方便多了,大家以後多試著用下,可以發現它的很多好處。

Huffman編碼的實現

include include define maxbit 100 定義哈夫曼編碼的最大長度 define maxvalue 100000 定義最大權值 define maxleaf 300 定義哈夫曼樹中最多葉子節點個數 define maxnode maxleaf 2 1 哈夫曼樹最多結點數 u...

Huffman編碼C 實現

huffman.h 葉子結點為n的哈夫曼樹共有2n 1個結點 ifndef huffman h define huffman h class huffmannode huffmannode const char data,const double wt,const int pa 1,const in...

Huffman編碼C實現

huffman編碼 根據huffman樹進行編碼的,用到的資料結構是二叉樹。typedef int elemtype typedef struct binarytree 2 構建最優二叉樹 void createhuffman int leafnum,binarytree huffmantree e...