貪心策略:每次從數的集合中取出沒有雙親且權值最小的兩棵樹作為左右子樹。
huffman編碼的基本思想:以字元的使用頻率作為權構建一棵huffman樹,然後利用huffman樹對字元進行編碼。
#include
using
namespace std;
#define maxbit 100
#define maxvalue 10000
#define maxleaf 30
#define maxnode maxleaf*2-1
typedef
struct
hnodetype;
//結點結構體
typedef
struct
hcodetype;
//編碼結構體
hnodetype huffnode[maxnode]
;//定乙個結點結構體陣列
hcodetype huffcode[maxleaf]
;//定義乙個編碼結構體陣列
//構造huffman樹
void
huffmantree
(hnodetype huffnode[maxnode]
,int n)
//輸入n個葉子結點的權值
for(i=
0;i)for
(i=0
;i1;i++
)//執行n-1次合併
else
if(huffnode[j]
.weight.parent==-1
)}//設定找到的兩個子結點x1,x2的父結點資訊
//更新新樹的資訊
huffnode[x1]
.parent=n+i;
//x1的父親為新結點編號n+i
huffnode[x2]
.parent=n+i;
//x2的父親為新結點編號n+i
huffnode[n+i]
.weight=m1+m2;
//新結點權值為兩個最小權值之和m1+m2
huffnode[n+i]
.lchild=x1;
//新結點n+i的左孩子為x1
huffnode[n+i]
.rchild=x2;
//新結點n+i的右孩子為x2
cout<<
"x1.weight and x2.weight in round"
<1<<
"\t"
<.weight<<
"\t"
<.weight/用於測試 }}
//huffman樹編碼
void
huffmancode
(hcodetype huffcode[maxleaf]
,int n)
//把葉子結點的編碼資訊,從臨時編碼cd中複製出來,放入編碼結構體陣列
for(j=cd.start+
1;j) huffcode[i]
.bit[j]
=cd.bit[j]
; huffcode[i]
.start=cd.start;}}
intmain()
return0;
}
貪心演算法 Huffman編碼
huffman編碼是資料壓縮常見的壓縮方法。即將不同概率出現的字元以不同長度的二進位制位進行編碼,概率出現的越高的字元使用長度越短的編碼,概率出現越低的字元使用長度越長的編碼。下面是對儲存字元出現概率的檔案charactorsheet.txt,每一行的左邊是字元出現的概率,單位是0.01,右邊是要編...
貪心演算法 赫夫曼編碼問題(Huffman)
赫夫曼編碼是一種廣泛用於資料壓縮的問題,該演算法的主要優勢在於節約了儲存和傳輸成本。舉乙個例子 假設要傳輸的資料為 那麼傳輸成本就是 45 3 30 3 29 3 10 3 8 3 5 3 381個字元 先合併最小頻率的2個字元對應的子樹,計算合併後的子樹的頻率 重新排序各個子樹 重複步驟1 重複步...
多元Huffman編碼問題 貪心演算法
在乙個操場的四周擺放著n堆石子。現要將石子有次序地合併成一堆。規定每次至少選2 堆最多選k堆石子合併成新的一堆,合併的費用為新的一堆的石子數。試設計乙個演算法,計算出將n堆石子合併成一堆的最大總費用和最小總費用。對於給定n堆石子,計算合併成一堆的最大總費用和最小總費用。input 輸入資料的第1 行...