以字串」this is a test「為例,生成霍夫曼編碼的步驟如下:
計算各字元的權重,這裡直接用字元出現的次數表示。
t 3
h 1i 2
s 3\space 3
a 1e 1
根據各字元的權重生成霍夫曼樹
14|--
-8||
---t(
3)||
---5|
|---i
(2)|
|---3
||---
h(1)
||---
2||--
-e(1
)||--
-a(1
)|---
6||--
-\space(3
)||--
-s(3
)
根據霍夫曼樹生成霍夫曼編碼
t 10
h 1110
i 110
s 01
\space 00
a 11111
e 11110
以上得到霍夫曼編碼後可以對檔案進行壓縮,繼續以字串「this is a test"為例,步驟如下:
使用霍夫曼編碼代替字串中的字元:
10111011001001100100111110010111100110
對不滿8位的進行填充
1011101100100110010011111001011110011000
將替換填充好的**放入壓縮檔案中即實現了檔案壓縮
10111011
00100110
01001111
10010111
10011000
———————— ———————— ———————— ———————— ————————
0xbb
0x26
0x4f
0x97
0x98
經過以上壓縮,檔案由14位元組轉為了5位元組,解壓即為逆過程。
#include
#include
#include
typedef
struct
node;
typedef
struct
code;
int count;
long
int len,sumbytes;
node huffmannode[
256]
;node*huffmantree;
code*huffmancode;
intgetweight
(char
*filepath)
int i;
count=0;
long
int flag=0;
unsigned
char ch;
memset
(huffmannode,0,
sizeof
(node)
*256);
fseek
(fp,0,
seek_end);
sumbytes=
ftell
(fp)
;fseek
(fp,0,
seek_set);
while
(flag
else
}fclose
(fp)
;return0;
}void
createhuffmantree()
for(
;i<
2*count-
1;i++
)for
(i=count;i<
2*count-
1;i++
)else
if(huffmantree[j]
.parent==-1
&&huffmantree[j]
.weight<=min2)
} huffmantree[x1]
.parent=huffmantree[x2]
.parent=i;
huffmantree[i]
.left=x1;huffmantree[i]
.right=x2;
huffmantree[i]
.weight=min1+min2;}}
void
genhuffmancode()
int cur,p,start;
char
*temp=
(char*)
malloc
(sizeof
(char)*
(count+1)
);temp[count]
='\0'
; huffmancode=
(code*
)malloc
(sizeof
(code)
*count)
;for
(int i=
0;i) huffmancode[i]
.ch=huffmantree[i]
.ch;
huffmancode[i]
.cd=
(char*)
malloc
(sizeof
(char)*
(count-start+1)
);strcpy
(huffmancode[i]
.cd,
&temp[start]);
}}intcompress
(char
*file_in,
char
*file_out)
long
int flag=0;
while
(flag
break;}
}}if(k)
fclose
(fp_in)
;fclose
(fp_out)
;printf
("壓縮完畢!\n");
return0;
}int
uncompress
(char
*file_in,
char
*file_out)
char temp[
512]
;unsigned
char ch;
int i,j,k=
0,tmp,flag;
while
(len>0)
}}if(i==count)
break;}
}fclose
(fp_in)
;fclose
(fp_out)
;printf
("解壓完畢!\n");
return0;
}int
main()
**效果:
壓縮演算法目前可用於壓縮txt,jpg,pdf等各類檔案,但是對除txt外的檔案的壓縮效果不好,且壓縮檔案存在大小限制,估計不超過2m,僅比較適用於txt文件的壓縮,有很大優化空間。
01 霍夫曼編碼 無失真壓縮
在計算機中,霍夫曼編碼使用變長編碼表對源符號 如檔案中的乙個字母 進行編碼,其中變長編碼表是通過一種評估 符號出現機率的方法得到的,出現機率高的字母使用較短的編碼,反之出現機率低的則使用較長的編碼,這便使編碼之後的字串的平均長度 期望值降低,從而達到無失真壓縮資料的目的。初始化,將符號概率按大到小進...
霍夫曼編碼
一 八卦 在 演算法為什麼這麼難?這篇部落格裡,劉未鵬講了乙個八卦 根據wikipedia的介紹,霍夫曼同學 當年還在讀ph.d,所以的確是 同學 而這個問題是坑爹的導師robert m.fano 給他們作為大作業的 fano自己和shannon合作給出了乙個suboptimal的編碼方案,為得不到...
霍夫曼編碼
給定乙個文字中出現的一組字元c,每個字元有其出現頻率freq,想構造字元的最優二進位制表示,即用來編碼整個文字的二進位制位最少 定長編碼 每個字元用相同長度的二進位制位數進行編碼,則每個字元的長度n必須滿足,2 n c 變長編碼 思想是賦予高頻字元短碼字,賦予低頻字元長碼字 編碼過程相對簡單,將表示...