(八)資料結構之哈夫曼(樹)編碼

2021-10-02 11:52:22 字數 2817 閱讀 3134

需要注意的是其實我在之前就已經發過關於建立哈夫曼樹,獲取哈夫曼編碼的的部落格(哈夫曼樹、哈夫曼編碼),這一篇文章更具體,還附帶了具體的演算法分析。而這一篇只是複習。

這篇部落格主要內容是關於如何通過存有權重的陣列建立哈夫曼樹,並得到哈夫曼編碼

根據權重陣列建立哈夫曼樹,

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 當帶權路徑長度最小的二叉樹被稱為哈夫曼樹,也成為最優二叉樹。如下圖所示,有三課二...