這裡的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...