標頭檔案huffman.h
#ifndef _huffman_h_
#define _huffman_h_
struct htnode
;typedef htnode *htree;
typedef char **hcode;
void
select
(htree ht
,int n,int &s1,int &s2)
;void
huffmancoding
(htree &
ht,hcode &
hc,int *w,int n)
;#endif
huffman.cpp
#include"huffman.h"
#include
#include
using namespace std;
void
select
(htree ht
,int n,int &s1,int &s2)
}}
int t=
ht[s1]
.weight;
ht[s1]
.weight=maxx;
minn=
99999998
;for
(int i=
1; i<=n; i++)}
}ht[s1]
.weight=t;
}void
huffmancoding
(htree &
ht,hcode &
hc,int *w,int n)
for(
; i<=m; i++
)for
(i=n+
1; i<=m; i++
)///建哈弗曼樹
///---從葉子到根逆向求每個字元的哈弗曼編碼---
char * cd;
int c,f,start;hc=
(hcode)
malloc
((n+1)
*sizeof
(char *))
;///分配n個字元編碼的頭指標向量
cd=(char*
)malloc
(n*sizeof
(char));
///分配求編碼的工作空間
cd[n-1]
='\0'
;///編碼結束符
for(i=
1; i<=n; i++
)///逐個字元求哈弗曼編碼
hc[i]
=(char*
)malloc
((n-start)
*sizeof
(char));
///從cd複製編碼到hc
strcpy(hc
[i],
&cd[start]);
}free
(cd)
;///釋放工作空間
}
測試
哈夫曼編碼 哈夫曼樹
1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....
哈夫曼樹 哈夫曼編碼
定義從a結點到b結點所經過的分支序列為從a結點到b結點的路徑 定義從a結點到b結點所進過的分支個數為從a結點到b結點的路徑長度 從二叉樹的根結點到二叉樹中所有結點的路徑長度紙盒為該二叉樹的路徑長度 huffman樹 帶權值路徑長度最小的擴充二叉樹應是權值大的外界點舉例根結點最近的擴充二叉樹,該樹即為...
哈夫曼編碼 哈夫曼樹
哈夫曼樹是乙個利用權值進行優化編碼的乙個比較奇怪的樹,他的實現比較簡單,用途也比較單一。哈夫曼樹的實現,實現要求 通過哈夫曼樹可以保證在編碼過程中不會出現例如 1000和100這樣的編碼規則,否則就會編碼失敗,因為1000和100在某些情況下的編碼會一模一樣。通過哈夫曼樹可以保證權值大的值進行編碼時...