sdut 数据结构实验之二叉树六:哈夫曼编码
生活随笔
收集整理的這篇文章主要介紹了
sdut 数据结构实验之二叉树六:哈夫曼编码
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>using namespace std;int main()
{char s[10000];while(scanf("%s",s)!=EOF){priority_queue < int,vector<int>,greater<int> > Q;//利用優(yōu)先隊列,從小到大排序int len=strlen(s);int i,max=0;int count[256]={0};for(i=0;i<len;i++){count[s[i]]++;//統(tǒng)計字符出現(xiàn)的頻率,利用ASCII對應(yīng)其數(shù)組的下標if(s[i]>max)max=s[i];//找出頻率最高的字符}for(i=0;i<=max;i++){if(count[i]!=0)Q.push(count[i]);//把字符出現(xiàn)的次數(shù)壓入優(yōu)先隊列之中}int sum=0;while(!Q.empty())//當隊列不為空的時候彈出值{int a=Q.top();//出第一個值Q.pop();if(!Q.empty()){int b=Q.top();//出第二個值Q.pop();sum+=(a+b);//模擬構(gòu)造赫夫曼樹的過程,不過不理解如下面的例題所示。Q.push(a+b);}}printf("%d %d %.1f\n",len*8,sum,len*8.0/sum);}return 0;
}
例題:一組字符(a,b,c,d)在文中出現(xiàn)的次數(shù)分別為(7,6,3,5),字符'd'的哈夫曼編碼的長度為?
首先構(gòu)造huffman樹
每一步都將所有數(shù)字排序
方法如下:
1:
3 5 6 7
2:
6 7 8
/ \
3 5
3:
8 13
/ \ / \
3 5 6 7
4:
21
/ \
8 13
/ \ / \
3 5 6 7
所以構(gòu)造哈夫曼樹如圖
7 6 3 5 分別對應(yīng)a b c d
如果左邊為0 ,右邊為 1 ,則他們編碼分別為:
a 11
b 10
c 00
d 01
長度為2
總結(jié)
以上是生活随笔為你收集整理的sdut 数据结构实验之二叉树六:哈夫曼编码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: node.js路由控制
- 下一篇: 数据结构实验之栈三:后缀式求值