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次 合併 運算後構造出的一棵樹。核心思想 權值越大的葉子離根越遠。貪心策略 ...