趣學演算法 貪心演算法 Huffman編碼

2021-08-29 07:12:13 字數 3533 閱讀 6700

huffman編碼的原理:

以字元的使用頻率作為權構建一棵哈夫曼樹,然後利用哈夫曼樹對字元進行編碼。構造一棵哈夫曼樹,是將所要編碼的字元作為葉子結點,該字元在檔案中的使用頻率作為葉子結點的權值,以「自底向上」的方式,通過n-1次「合併」運算後構造出的一棵樹。

核心思想:權值越大的葉子離根越遠。

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

先構建一棵huffman樹:

(1)先找到權值最小且沒有父親的兩個結點進行合併,建立一棵樹,然後迴圈建立。

設定結構體:

typedef struct hnodetype;//節點結構體

typedef struct hcodetype; //編碼結構體

hnodetype huffnode[maxnode];

hcodetype huffcode[maxleaf];

初始化:

int x1, x2;//兩個最小權值結點在陣列中的序號

double m1, m2;//兩個最小權值結點的權值

//初始化哈夫曼陣列中的結點

for(i = 0; i <= 2*n - 1; ++ i)

//輸入n個葉子結點的名稱和權值

for(i = 0; i < n; ++i)

構造huffman樹

//構造huffman樹(核心) 

for(i = 0 ; i < n-1; ++i)

else if(m2 > huffnode[j].weight && huffnode[j].parent == -1)

}//設定找到的兩個結點的父節點的資訊

huffnode[n+i].weight = m1 + m2;

huffnode[n+i].lchild = x1;

huffnode[n+i].rchild = x2;

huffnode[x1].parent = n+i;

huffnode[x2].parent = n+i;

cout << "x1.weight and x2.weight in round" << i+1 <

<< huffnode[x1].weight << "\t" << huffnode[x2].weight << endl;

}

2. 輸出哈夫曼編碼

//把葉子結點的編碼資訊從臨時編碼cd複製出來,放入編碼結構體陣列

for(j = cd.start+1; j < n; ++ j)

huffcode[i].bit[j] = cd.bit[j];

huffcode[i].start = cd.start;

} }

合併後的**:

#includeusing 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];

/* 構造哈夫曼樹:先找到權值最小且無父親的兩個節點,合併成新的節點*/

void huffmantree(hnodetype huffnode[maxnode], int n)

//輸入n個葉子結點的名稱和權值

for(i = 0; i < n; ++i)

//構造huffman樹(核心)

for(i = 0 ; i < n-1; ++i)

else if(m2 > huffnode[j].weight && huffnode[j].parent == -1)

}//設定找到的兩個結點的父節點的資訊

huffnode[n+i].weight = m1 + m2;

huffnode[n+i].lchild = x1;

huffnode[n+i].rchild = x2;

huffnode[x1].parent = n+i;

huffnode[x2].parent = n+i;

cout << "x1.weight and x2.weight in round" << i+1 <

<< huffnode[x1].weight << "\t" << huffnode[x2].weight << endl;

}

} /*哈夫曼編碼:從葉子結點開始,檢視其是否有父親結點,如果有,檢視是其父親結點的

左孩子還是右孩子,左孩子編碼為0,右孩子編碼為1*/

void huffmancode(hcodetype huffcode[maxleaf], int n)

//把葉子結點的編碼資訊從臨時編碼cd複製出來,放入編碼結構體陣列

《趣學演算法》之貪心演算法(上)

乙個貪心演算法總是做出當前最好的選擇,也就是說,它期望通過區域性最優選擇從而得到全域性最優的解決方案。演算法導論 貪心演算法秘籍 有一天,加勒比海盜們截獲了一艘裝滿古董的貨船,每件古董都價值連城,一旦打碎就失去價值。雖然海盜船足夠大,但載重量為 c,每件古董的重量為 wi 海盜們該如何把盡可能多數量...

貪心演算法 Huffman編碼

huffman編碼是資料壓縮常見的壓縮方法。即將不同概率出現的字元以不同長度的二進位制位進行編碼,概率出現的越高的字元使用長度越短的編碼,概率出現越低的字元使用長度越長的編碼。下面是對儲存字元出現概率的檔案charactorsheet.txt,每一行的左邊是字元出現的概率,單位是0.01,右邊是要編...

貪心演算法 赫夫曼編碼問題(Huffman)

赫夫曼編碼是一種廣泛用於資料壓縮的問題,該演算法的主要優勢在於節約了儲存和傳輸成本。舉乙個例子 假設要傳輸的資料為 那麼傳輸成本就是 45 3 30 3 29 3 10 3 8 3 5 3 381個字元 先合併最小頻率的2個字元對應的子樹,計算合併後的子樹的頻率 重新排序各個子樹 重複步驟1 重複步...