貪心演算法 Huffman編碼 神秘電報密碼

2021-10-02 08:55:49 字數 1631 閱讀 6627

貪心策略:每次從數的集合中取出沒有雙親且權值最小的兩棵樹作為左右子樹。

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 行...