貪心演算法 Huffman編碼

2021-07-14 16:50:46 字數 3882 閱讀 8657

huffman編碼是資料壓縮常見的壓縮方法。即將不同概率出現的字元以不同長度的二進位制位進行編碼,概率出現的越高的字元使用長度越短的編碼,概率出現越低的字元使用長度越長的編碼。

下面是對儲存字元出現概率的檔案charactorsheet.txt,每一行的左邊是字元出現的概率,單位是0.01,右邊是要編碼的字元。檔案內容如下:

45 a

13 b

12 c

16 d

9 e

5 f

本篇**實現對a、b、c、d、e、f六個出現概率不同的字元進行編碼。

實現思路是:先構建乙個最小堆,取出最小堆中最小的兩個元素構成一棵二叉樹,該二叉樹的根結點的概率為兩個元素的概率和。然後再將二叉樹根結點存入最小堆中。再取出二叉樹中兩個最小的元素,進行構建二叉樹,直至堆中元素被取光。

**如下:

/*

*huffman編碼

*使用最小堆排序來獲取概率最小的元素

* author: storymonster

*last change date: 2016/6/28

*/#include

#include

#include

typedef struct huffmannode

huffmannode;

static void readcharactorsheet(void);

static void inserttominpeal(huffmannode *node);

static bool insertrecursion(huffmannode *r, huffmannode *node);

static void fixminpeal(huffmannode *r);

static void getminnode(huffmannode *r, huffmannode *node);

static huffmannode* getmaxindexnode(huffmannode *r);

static void buildhuffmantree(void);

static void printhuffmancode(huffmannode *r, int hight);

static void printthepeal(huffmannode *r);

huffmannode *root = (huffmannode *)malloc(sizeof(huffmannode));

huffmannode *huffmanroot = (huffmannode *)malloc(sizeof(huffmannode));

int nodecount =

0;void printhuffmancode(huffmannode *r,int hight)

std::cout

<<

" "

}else

if(r->huffright !=

null)

}void printthepeal(huffmannode *r)

std::cout

<< r->percent <<

":";

if(r->left !=

null) std::cout

<<(r->left)->percent;

else std::cout

<<

"null";

if(r->right!=

null) std::cout

<<

" "<<(r->right)->percent;

else std::cout

<<

" null";

std::cout

<< std::endl;

printthepeal(r->left);

printthepeal(r->right);

}void printthehuffmantree(huffmannode *root)

void buildhuffmantree(void)

}huffmannode *getmaxindexnode(huffmannode *r)

if(r->left ==

null) return

null;

huffmannode *p = getmaxindexnode(r->left);

if(p!=

null) return p;

p = getmaxindexnode(r->right);

if(p!=

null) return p;

}void getminnode(huffmannode *r,huffmannode *node)

node->charactor = r->charactor;

node->index = r->index;

node->percent = r->percent;

node->code = r->code;

node->huffleft = r->huffleft;

node->huffright = r->huffright;

node->hufffather = r->hufffather;

r->percent = p->percent;

r->charactor = p->charactor;

r->code = p->code;

r->huffleft = p->huffleft;

r->huffright = p->huffright;

r->hufffather =

null;

p->left =

null;

p->right =

null;

nodecount--;

free(p);

p =null;

fixminpeal(r);

}bool insertrecursion(huffmannode *r, huffmannode *node)

if(node->index == (2

*(r->index)+

1))

if(r->left ==

null

||r->right ==

null) return

false;

bool result = insertrecursion(r->left,node);

if(result ==

false)

result = insertrecursion(r->right,node);

return result;

}void fixminpeal(huffmannode *r)

fixminpeal(r->left);

}if(r_right ==

null) return ;

else

fixminpeal(r->right);

}}void inserttominpeal(huffmannode *node)

insertrecursion(root,node);

//fixminpeal(node);

//printthepeal(root);

}void readcharactorsheet()

int index =

1; while(1)

fclose(fp);

fp =

null;

}int main()

這篇**寫得有些糟糕,但是功能是實現了的。之後找時間再重新修改一下**。

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

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

多元Huffman編碼問題 貪心演算法

在乙個操場的四周擺放著n堆石子。現要將石子有次序地合併成一堆。規定每次至少選2 堆最多選k堆石子合併成新的一堆,合併的費用為新的一堆的石子數。試設計乙個演算法,計算出將n堆石子合併成一堆的最大總費用和最小總費用。對於給定n堆石子,計算合併成一堆的最大總費用和最小總費用。input 輸入資料的第1 行...

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

huffman編碼的原理 以字元的使用頻率作為權構建一棵哈夫曼樹,然後利用哈夫曼樹對字元進行編碼。構造一棵哈夫曼樹,是將所要編碼的字元作為葉子結點,該字元在檔案中的使用頻率作為葉子結點的權值,以 自底向上 的方式,通過n 1次 合併 運算後構造出的一棵樹。核心思想 權值越大的葉子離根越遠。貪心策略 ...