需要注意的是其實我在之前就已經發過關於建立哈夫曼樹,獲取哈夫曼編碼的的部落格(哈夫曼樹、哈夫曼編碼),這一篇文章更具體,還附帶了具體的演算法分析。而這一篇只是複習。
這篇部落格主要內容是關於如何通過存有權重的陣列建立哈夫曼樹,並得到哈夫曼編碼。
根據權重陣列建立哈夫曼樹,
int weight=
;//n個元素
步驟:1.選出權重最小的兩個權重,從陣列中抹除(不必真正抹除,只需簡單標記即可)
2.將這兩個權重之和相加,得到的值放入權重陣列中
3.將這兩個節點的父節點設為這個新加入的節點,同時新節點的左右孩子分別是這兩個節點
4.重複上述過程直到,儲存哈夫曼樹的陣列佔滿即可;
步驟:1.對儲存哈夫曼樹的陣列前n個元素(最開始的n個節點在建成哈夫曼樹之後都是葉子節點,需要注意),依次回溯其父節點,直到父節點為0為止(即:到達了根節點)
2.在回溯根節點的過程中儲存下哈夫曼編碼
3.重複上述過程即可;
看**,注釋我會盡量多寫,讓大家看清楚。
#include
#include
//提供strcpy函式
using
namespace std;
typedef
char
*p_char;
//方便之後使用,也可使用巨集定義
//------------------------建立哈夫曼樹---------------------//
//哈夫曼樹節點的結構
typedef
struct
hufnode,
*phufnode;
void
create_huffman_tree
(p_char *
&code,
int*w,
int n)
;for
(; i < num;
++i)
node[i]=;
//建立哈夫曼樹
int fir, sec,
var, mark,
pos;
bool ok;
//choose the first
for(i = n; i < num;
++i)if(
!ok)
continue;if
(!node[var]
.parent &&
(node[pos]
.weight > node[var]
.weight)
) pos = var;
} node[mark ?
(sec = pos, sec)
:(fir = pos, fir)
].parent =-1
;//置為-1代表已使用
} node[i]
.lchild = fir; node[i]
.rchild = sec;
node[fir]
.parent = i; node[sec]
.parent = i;
node[i]
.weight = node[fir]
.weight + node[sec]
.weight;
}//獲取哈夫曼編碼
code =
new p_char[n]
;//從0開始
char
*tmp =
newchar
[n];
tmp[n -1]
='\0'
;int len,
//輔助
par, cur;
for(i =
0, len = n -
1; i < n;
++i, len = n -1)
//ok
}int
main()
;//權重
int num =
sizeof weight /
sizeof
(int);
p_char *hufcode;
//儲存哈夫曼編碼
create_huffman_tree
(hufcode, weight, num)
;for
(int i =
0; i < num;
++i)
//輸出編碼
cout << hufcode[i]
<< endl;
return0;
}
雖然之前寫過,但還是遇到了問題,困擾了我不少時間,
1,第乙個就是為儲存哈夫曼編碼的陣列分配頭節點空間時,
code =
newchar
*[n]
;//這個我當時認為對編譯器產生了歧義,於是我使用typedef char * p_char來代替char *
code =
new p_char[n]
;//與上面的寫法等價
2,在使用strcpy函式時,
strcpy
(code[i]
,&tmp[len]);
//因為我只分配了頭結點的空間,卻沒有為每乙個行分配空間,所以進行記憶體拷貝是
//有問題的
因為我只分配了頭結點的空間,卻沒有為每乙個行分配空間,所以此時進行記憶體拷貝是有問題的,會終止程式(這個問題我真的找了好久!!) 資料結構 哈夫曼樹 哈夫曼編碼
哈夫曼樹又稱最優樹 二叉樹 是一類帶權路徑最短的樹。構造這種樹的演算法最早是由哈夫曼 huffman 1952年提出,這種樹在資訊檢索中很有用。結點之間的路徑長度 從乙個結點到另乙個結點之間的分支數目。樹的路徑長度 從樹的根到樹中每乙個結點的路徑長度之和。結點的帶權路徑長度 從該結點到樹根之間的路徑...
哈夫曼編碼 哈夫曼樹 (資料結構)
哈夫曼編碼,又稱霍夫曼編碼,是一種編碼方式,哈夫曼編碼是可變字長編碼 vlc 的一種。huffman於1952年提出一種編碼方法,該方法完全依據字元出現概率來構造異字頭的平均長度最短的碼字,有時稱之為最佳編碼,一般就叫做huffman編碼 有時也稱為霍夫曼編碼 include include inc...
資料結構之哈夫曼樹及哈夫曼編碼
當樹中的節點被賦予乙個表示某種意義的數值,我們稱之為該節點的權。從樹的根節點到任意節點的路徑長度 經過的邊數 與該節點上權值的乘積稱為該節點的帶權路徑長度。樹中所有葉節點的帶權路徑長度之和稱為該樹的帶權路徑長度 wpl 當帶權路徑長度最小的二叉樹被稱為哈夫曼樹,也成為最優二叉樹。如下圖所示,有三課二...