日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sdut 数据结构实验之二叉树六:哈夫曼编码

發布時間:2024/8/23 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sdut 数据结构实验之二叉树六:哈夫曼编码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#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;//利用優先隊列,從小到大排序int len=strlen(s);int i,max=0;int count[256]={0};for(i=0;i<len;i++){count[s[i]]++;//統計字符出現的頻率,利用ASCII對應其數組的下標if(s[i]>max)max=s[i];//找出頻率最高的字符}for(i=0;i<=max;i++){if(count[i]!=0)Q.push(count[i]);//把字符出現的次數壓入優先隊列之中}int sum=0;while(!Q.empty())//當隊列不為空的時候彈出值{int a=Q.top();//出第一個值Q.pop();if(!Q.empty()){int b=Q.top();//出第二個值Q.pop();sum+=(a+b);//模擬構造赫夫曼樹的過程,不過不理解如下面的例題所示。Q.push(a+b);}}printf("%d %d %.1f\n",len*8,sum,len*8.0/sum);}return 0; }

例題:一組字符(a,b,c,d)在文中出現的次數分別為(7,6,3,5),字符'd'的哈夫曼編碼的長度為?

首先構造huffman樹
每一步都將所有數字排序
方法如下:
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
所以構造哈夫曼樹如圖
7 6 3 5 分別對應a b c d
如果左邊為0 ,右邊為 1 ,則他們編碼分別為:
a 11
b 10
c 00
d 01
長度為2


總結

以上是生活随笔為你收集整理的sdut 数据结构实验之二叉树六:哈夫曼编码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。