哈夫曼編碼演算法及其實現

2021-07-16 05:02:49 字數 1630 閱讀 8801

哈夫曼編碼就是利用哈夫曼樹構造的最優編碼。

基本思想是:為出現次數較多的字元編以較短的編碼。

對於每個字元,根據其出現的次數為權值,構造哈夫曼樹。然後從根到每個葉子節點的路徑上,左分支賦值0,右分支賦值1,個分支構成乙個二進位制串,這個二進位制串就是哈夫曼編碼。

#include 

#include

#include

using

namespace

std;

//哈夫曼樹的儲存表示

typedef

struct

htnode, *huffmantree;

// 哈夫曼編碼表的儲存表示

typedef

struct

huffmancode;

// 選擇權值最小的兩顆樹

void selectmin(huffmantree ht, int n, int &s1, int &s2)

else}}

if(ht[s1].weight > ht[s2].weight)

for(i += 1; i < n; ++ i)else

if(ht[i].weight < ht[s2].weight)}}

}// 構造有n個權值(葉子節點)的哈夫曼樹

void createhufmantree(huffmantree &ht)

for(int i = 1; i <= n; ++ i)

ht[0].weight = m; // 用0號節點儲存節點數量

/****** 初始化完畢, 建立哈夫曼樹 ******/

for(int i = n + 1; i <= m; ++ i)

}// 構造根據哈夫曼樹來哈夫曼編碼

void createhuffmancode(huffmantree ht, huffmancode &hc)

else

child = parent;

parent = ht[parent].parent;

}cd[len] = 0;

reverse(cd, cd + len); // 將序列翻轉

hc.code[i] = new

char[len];

strcpy(hc.code[i], cd);

}delete cd;

}// 輸出哈夫曼表

void printhuffmancode(huffmancode &hc)

}// 銷毀哈夫曼樹

void destoryhuffmantree(huffmantree &ht)

// 銷毀哈夫曼編碼表

void destoryhuffmancode(huffmancode &hc)

delete hc.code;

hc.code = null;

}int main()

對於串「abcdabcdaaaaabbbdd」,

a、b、c、d出現的次數分別為7、5、2、4,構造的編碼表為:

ps:更完整的解碼編碼可以參考:

哈夫曼編碼演算法實現

哈夫曼編碼實現huffmantree.c include include includetypedef struct htnode,huffmantree 動態分配陣列儲存哈夫曼樹 typedef char huffmancode 動態分配陣列儲存哈夫曼編碼 void select huffmant...

哈夫曼樹及其編碼

include include include includeusing namespace std define ok 1 define error 0 define true 1 define false 0 typedef int status 定義哈夫曼樹結點 typedef struct ...

哈夫曼樹及其編碼

首先是哈夫曼樹的定義 在一棵二叉樹中,帶權路徑長度達到最小,成這樣的樹是最優二叉樹,也是哈弗曼樹。大概意思就是把數值大的節點放在樹上面,數值小的節點放在樹下面。哈夫曼樹的結構使用順序結構,這裡直接使用了陣列。建造哈弗曼樹的思路 根據二叉樹的性質,有n個葉子節點,二叉樹就會有2n 1個節點。定義乙個陣...