霍夫曼編碼及檔案壓縮

2021-10-17 03:18:19 字數 3735 閱讀 1429

以字串」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 變長編碼 思想是賦予高頻字元短碼字,賦予低頻字元長碼字 編碼過程相對簡單,將表示...