time limit: 1000ms memory limit: 65536k 有疑問?點這裡^_^
字元的編碼方式有多種,除了大家熟悉的ascii
編碼,哈夫曼編碼
(huffman coding)
也是一種編碼方式,它是可變字長編碼。該方法完全依據字元出現概率來構造出平均長度最短的編碼,稱之為最優編碼。哈夫曼編碼常被用於資料檔案壓縮中,其壓縮率通常在
20%~
90%之間。你的任務是對從鍵盤輸入的乙個字串求出它的
ascii
編碼長度和哈夫曼編碼長度的比值。
輸入資料有多組,每組資料一行,表示要編碼的字串。
對應字元的
ascii
編碼長度la,
huffman
編碼長度lh和
la/lh的值(
保留一位小數
),資料之間以空格間隔。
aaaaabcdthe_cat_in_the_hat
64 13 4.9這裡先講c++中使用stl優先佇列的方法模擬哈夫曼編碼。144 51 2.8
用法:示例:將元素5,3,2,4,6依次push到優先佇列中,print其輸出。
1. 標準庫預設使用元素型別的《操作符來確定它們之間的優先順序關係。
priority_queue pq;通過《操作符可知在整數中元素大的優先順序高。
故示例1中輸出結果為: 6 5 4 3 2
2. 資料越小,優先順序越高
priority_queue, greater >pq;其中
第二個引數為容器型別。
第三個引數為比較函式。
greater
表示t類運算。
和**中的自定義cmp函式效果一樣。
函式物件
故示例2中輸出結果為:2 3 4 5 6
3. 自定義優先順序,過載比較符號
過載預設的 < 符號
struct nodeint priority;
int value;
};
priority_queueqn;這時,需要為每個元素自定義乙個優先順序。
注:過載》號會編譯出錯,因為標準庫預設使用元素型別的《操作符來確定它們之間的優先順序關係。
而且自定義型別的《操作符與》操作符並無直接聯絡。
#include#include#includeusing namespace std;
char a[10000];
int b[1000];
struct cmp
};int main()
;void creatht(tnode ht,char st) //建立哈夫曼樹
// for(int i=0; i
//
// if(!flag)
//
// }
int a[1000];
memset(a,0,sizeof(a));
for(int i=0; i
a[st[i]]++;
for(int i=0; i<130; i++)
if(a[i]!=0)
for(int i=j; i
else if(ht[k].w
}ht[i].w=ht[r].w+ht[l].w;
ht[i].l=l;
ht[i].r=r;
ht[l].p=i;
ht[r].p=i;
}}int print(tnode ht)
int main()
}
資料結構實驗之二叉樹六 哈夫曼編碼
time limit 1000ms memory limit 65536k 字元的編碼方式有多種,除了大家熟悉的ascii 編碼,哈夫曼編碼 huffman coding 也是一種編碼方式,它是可變字長編碼。該方法完全依據字元出現概率來構造出平均長度最短的編碼,稱之為最優編碼。哈夫曼編碼常被用於資料...
資料結構實驗之二叉樹六 哈夫曼編碼
time limit 1000ms memory limit 65536k 字元的編碼方式有多種,除了大家熟悉的ascii 編碼,哈夫曼編碼 huffman coding 也是一種編碼方式,它是可變字長編碼。該方法完全依據字元出現概率來構造出平均長度最短的編碼,稱之為最優編碼。哈夫曼編碼常被用於資料...
資料結構實驗之二叉樹六 哈夫曼編碼
time limit 1000ms memory limit 65536k 有疑問?點這裡 字元的編碼方式有多種,除了大家熟悉的ascii 編碼,哈夫曼編碼 huffman coding 也是一種編碼方式,它是可變字長編碼。該方法完全依據字元出現概率來構造出平均長度最短的編碼,稱之為最優編碼。哈夫曼...