今天看了趣學演算法中的有關哈夫曼樹的乙個問題,就蠻有興致再寫一次哈夫曼樹,但這個演算法的實現和我之前的哈夫曼的實現方法略有不同。 宣告一下,這個實現我是採納書上的,覺得還不錯,就寫了。
這個問題是這樣描述的:
在遠距離的資訊通訊過程和大容量資料儲存方面運用比較廣泛的資料壓縮就是採用哈夫曼編碼進行的。如果讓我們嘗試一次,哈夫曼樹應該如何實現呢?
回憶一下:哈夫曼樹的幾個性質,我們要知道,哈夫曼樹沒有度為一的結點,而且n個葉子結點的哈夫曼樹具有 2 * n - 1個結點 。然後呢,利用類似二叉樹的分為左右兩個孩子節點起關係連線作用。最後呢,我們所求得到的編碼要是從葉子節點到根節點路徑。了解這一些,我們就開始吧。
我們採用的struct的儲存方式,其中struct的結構體內容有
int lchild;
//左孩子
int rchild;
//右孩子
double weight;
//權值
char value;
//該節點所代表的字元
然後呢,與之前的不一樣的地方來了,我們將每個葉子節點到
根節點的路徑都分別用陣列存起來,而不是直接建立二叉樹然後遍歷求權重,就如同
直接利用數字 0 和 1來區分該節點的左右孩子;
首先固定陣列的最大長度,例如:bit[maxsize],將 maxsize 賦值為至少為 2 * n - 1;
然後呢就會這樣:0 1 0 1 1 0 1表示哈夫曼編碼;我覺得這樣實現,比我以前的實現方法好一點,
文末附上我之前的實現方法的鏈結。
現在就是**實現c++(這是原書上的)
#include
#include
#include
#include
using namespace std;
#define maxbit 100
#define maxvalue 1000000
#define maxleaf 30
#define maxnode maxleaf * 2 - 1
typedef
struct
hnodetype;
hnodetype huffnode[maxnode]
;//節點結構體
typedef
struct
hcodetype;
hcodetype huffcode[maxleaf]
;//編碼結構體陣列
void
huffmantree
(hnodetype huffnode[maxnode]
,int n)
for(i =
0;i <= n -
1;i++
)for
(i =
0; i < n -
1;i++
)else
if(huffnode[j]
.weight < m2 && huffnode[j]
.parent ==-1
)} huffnode[x1]
.parent = n + i;
huffnode[x2]
.parent = n + i;
huffnode[n+i]
.weight = m1 + m2;
huffnode[n+i]
.lchild = x1;
huffnode[n+i]
.rchild = x2;
}return;}
void
huffmancode
(hcodetype huffcode[maxleaf]
,int n)
for(j = cd.start +
1;j <= n -
1;j++
) huffcode[i]
.bit[j]
= cd.bit[j]
; huffcode[i]
.start = cd.start;
}return;}
intmain()
return0;
}
這個是稍微改動的c語言實現,沒有測試
#include
#define maxsize 1000
typedef
struct
hnode;
hnode huffnode[maxsize]
;//節點結構體
typedef
struct
hcode;
hcode huffcode[maxsize]
;//編碼結構體陣列
void
huffmantree
(int n)
for(i =
0;i <= n -
1;i++
)for
(i =
0;i < n -
1;i++
)else
if(huffnode[j]
.weight < m2 && huffnode[j]
.parent ==-1
)} huffnode[x1]
.parent = n + i;
//合併兩個節點
huffnode[x2]
.parent = n + i;
huffnode[n+i]
.weight = m1 + m2;
huffnode[n+i]
.lchild = x1;
huffnode[n+i]
.rchild = x2;
}return;}
void
huffmancode
(int n)
for(j = temp.start +
1;j <= n -
1;j++)
huffcode[i]
.start = temp.start;
//開始位置
}return;}
intmain()
return0;
}
哈夫曼樹講解(二叉樹) 哈夫曼編碼 哈夫曼樹
1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....
哈夫曼樹 哈夫曼編碼
定義從a結點到b結點所經過的分支序列為從a結點到b結點的路徑 定義從a結點到b結點所進過的分支個數為從a結點到b結點的路徑長度 從二叉樹的根結點到二叉樹中所有結點的路徑長度紙盒為該二叉樹的路徑長度 huffman樹 帶權值路徑長度最小的擴充二叉樹應是權值大的外界點舉例根結點最近的擴充二叉樹,該樹即為...
哈夫曼編碼 哈夫曼樹
哈夫曼樹是乙個利用權值進行優化編碼的乙個比較奇怪的樹,他的實現比較簡單,用途也比較單一。哈夫曼樹的實現,實現要求 通過哈夫曼樹可以保證在編碼過程中不會出現例如 1000和100這樣的編碼規則,否則就會編碼失敗,因為1000和100在某些情況下的編碼會一模一樣。通過哈夫曼樹可以保證權值大的值進行編碼時...