資料結構實戰(三) 三 Huffman編碼

2021-10-07 14:37:34 字數 1915 閱讀 9033

對一篇英文文章,統計其中26個小寫字母出現的頻次,對這些小寫字母進行huffman編碼。

用hf來存放51個結點。先輸出文字並用count陣列記錄每個字母出現次數。對hf初始化,然後每次將weight最小的兩個結點組成乙個新的結點,直到生成了51個結點。對每個字母對應的bianma賦值,先求出bianma長度然後倒序賦值,左孩子賦0,右孩子賦1。輸出每個字母輸出的次數及對應的編碼。最後用「shuru.txt」輸入編碼,一一判斷是否是某個字母對應的編碼,分別操作,輸出文字。時間複雜度為o(n)(n為文字長度)

#include

#include

#include

typedef

struct nodehf;

intzhuanhua

(char ch)

intmain()

,i,visit[51]

=,n=

26,mmin,mmmin,j,k,length;

//count記錄每個字母出現次數,visit在生成樹時記錄每個字母是否已有pa,n為當前結點數量,mmin是每次迴圈最小數 mmmin是第二小數,length是每個字母的bianma長度 if(

!f)printf

("原文本:\n");

while

((ch=

getc

(f))

!=eof)}

fclose

(f);

for(i=

0;i<

2*n-

1;i++

)for

(i=0

;i)while

(n<51)

}for

(i++

;i)else

break;}

}for

(i++

;i)else}}

} visit[mmin]=1

;visit[mmmin]=1

; hf[n]

.weight=hf[mmin]

.weight+hf[mmmin]

.weight;

hf[n]

.left=mmmin;

hf[n]

.right=mmin;

hf[mmin]

.pa=n;

hf[mmmin]

.pa=n;

n++;}

for(i=

0;i<

26;i++

) k=i;

j=1;

while

(hf[k]

.pa)

else

k=hf[k]

.pa;

j++;}

bianma[length]

='\0'

;strcpy

(hf[i]

.bianma,bianma);}

for(i=

0;i<

26;i++

) f=

fopen

("shuru.txt"

,"r");

//輸入編碼,輸出字元 if(

!f) i=0;

while

((ch=

getc

(f))

!=eof)}

if(j==26)

}fclose

(f);

return0;

}//共128行

總結寫好了才發現沒用什麼全在主函式裡寫的沒用什麼別的函式。。。初始化這些操作可以寫個函式來完成。對大寫字母以及數字、標點、空格等都直接忽略了,導致輸出的文章很傻。同時,對於沒有輸出的字母不應該賦編碼,有空會把這些都加進去再寫乙個更完善的。

資料結構 Huffman樹

參照書上寫的huffman樹的 結構用的是線性儲存的結構 不是二叉鍊錶 裡面要用到查詢最小和第二小 理論上錦標賽法比較好 但是實現好麻煩啊 考慮到資料量不是很大 就直接用比較笨的先找最小 去掉最小再找第二小的方法了。include include include typedef struct htn...

資料結構 Huffman樹

參照書上寫的huffman樹的 結構用的是線性儲存的結構 不是二叉鍊錶 裡面要用到查詢最小和第二小 理論上錦標賽法比較好 但是實現好麻煩啊 考慮到資料量不是很大 就直接用比較笨的先找最小 去掉最小再找第二小的方法了。include include include typedef struct htn...

資料結構Huffman編碼解碼

1 需求分析 1.1問題描述 問題描述 利用哈夫曼編碼進行通訊可以大大提高通道利用率,縮短資訊傳輸時間,降低傳輸成本。但是,這要求在傳送端通過乙個編碼系統對待傳資料預先編碼,在接收端將傳來的資料進行解碼 解碼 對於雙工通道 即可以雙向傳輸資訊的通道 每端都需要乙個完整的編 解碼系統。試為這樣的資訊收...