貪心演算法 最優字首碼

2021-10-06 05:04:10 字數 1736 閱讀 2178

給定字符集c=和每個字元的頻率f(xi),求關於c的乙個最優字首碼。

構造最優字首碼的貪心演算法就是哈夫曼演算法(huffman)

舉例

規則是:依次讀人檔案的二進位製碼,從哈夫曼樹的根結點出發,若當前讀入0,則走向左孩子,否則走向右孩子。

#include

#include

#include

#include

using namespace std;

#define n 8

//葉子數目

#define m 2*n-1

//樹中結點總數

typedef

struct

htnode;

typedef htnode huffmantree[m]

;//huffmantree是向量型別

typedef

struct

temp;

typedef

struct

codenode;

typedef codenode huffmancode[n]

;//初始化哈夫曼樹

void

inithuffmantree

(huffmantree t)

}//輸入葉子權值

void

inputweight

(huffmantree t)

}//用於排序的比較函式

bool cmp

(temp a, temp b)

//在前k個結點中選擇權值最小和次小的根結點,其序號分別為p1和p2

void

selectmin

(huffmantree t,

int k,

int* p1,

int* p2)

}sort

(x, x + j, cmp)

;//對x按照權值從小到大排序

//排序後的x向量的第一和第二個位置中儲存的id是所找的根節點的序號值

*p1 = x[0]

.id;

*p2 = x[1]

.id;

}//根據哈夫曼樹t求哈夫曼編碼表h

void

charsethuffmanencoding

(huffmantree t, huffmancode h)

strcpy_s

(h[i]

.bits,

&cd[start]);

//複製編碼位串}}

void

createhuffmantree

(huffmantree t)

}int

main()

printf

("平均碼長為:%.2lf\n"

, wpl)

;return0;

}

時間複雜度o(n)=

哈夫曼編碼最優字首碼的貪心演算法

哈夫曼編碼是廣泛地用於資料檔案壓縮的十分有效的編碼方法。其壓縮率通常在20 90 之間。哈夫曼編碼演算法用字元在檔案 現的頻率表來建立乙個用0,1串表示各字元的最優表示方式。字首碼 對每乙個字元規定乙個0,1串作為其 並要求任一字元的 都不是其他字元 的字首。這種編碼稱為字首碼。編碼的字首性質可以使...

貪心演算法 最優裝載

貪心演算法思想 不從整體最優上加以考慮,它所做出的選擇只是在某種意義上的區域性最優選擇,當然希望貪心演算法得到的最終結果也是整體最優的 貪心演算法性質 指所求問題的整體最優解可以通過一系列區域性最優的選擇,即貪心選擇來達到 1 問題描述 有一批貨櫃要裝上一艘載重量為 tatol 的輪船,其中貨櫃 i...

二元最佳字首碼 貪心 最優字首碼

二元字首碼 任何字元的 不能作為其它字元 的字首.eg.q 不是二元字首 如序列0100001會產生歧義 設c 是n個字元的集合,f xi 為xi出現的頻率,d xi 為xi的碼長,i 1,2,n.儲存乙個字元的平均二進位制位數 碼數 b sum limits f x i d x i 每個二元字首碼...