huffman編碼實現資料壓縮

2021-10-07 18:37:50 字數 2883 閱讀 1673

#huffman編碼壓縮

huffman編碼壓縮的**如下:

主方法

public

static

void

main

(string[

] args)

2.統計內容的字元數量,構建list為哈夫曼樹做準備

//將統計字元個數的方法封裝

public

static list

countcharnum

(byte

bytes)

else

} list

nodes =

newarraylist

<

>()

;//遍歷map,建立node物件放在list中

for(map.entry

entry : count.

entryset()

)return nodes;

}

3.構建huffman樹

//構建哈夫曼樹

public

static node createhuffmantree

(byte

bytes)

//返回root節點

return nodes.

get(0)

;}

4.根據哈夫曼樹,找到每個葉子節點路徑,獲得huffman編碼

static map

huffmancodes =

newhashmap

<

>()

;//尋找葉子節點並拼接路徑--使用stringbuilder類拼接字串效率高,執行緒不安全,適用單執行緒,

//過載一下路徑編碼方法--只需要傳哈夫曼樹的根節點就行

public

static map

getpathcodes

(node node)

// 遍歷右子樹

if(node.right != null)

}else

return huffmancodes;

}/**

* @param node 傳入的節點,需要判斷data,且幫助遞迴

* @param code 路徑編碼,左邊"0" 右邊"1"

* @param stringbuilder 遞迴需要,未找到葉子節點之前,需要保留引用變數拼接串物件一直拼接

*/public

static

void

getpathcodes

(node node,string code,stringbuilder stringbuilder)

//遍歷右節點

if(node.right!=null)

}else

}

5.通過huffman編碼壓縮成相應的byte陣列

// 將壓縮過程的方法全部封裝

public

static

byte

gethuffmancodesbytes

(byte

bytes)

// 方便解碼的 時候判斷解碼的正確性--最後一位少位的化補齊0.將拼接的字串設定成靜態變數

static stringbuilder huffmancodesstr =

newstringbuilder()

;//通過路編碼獲得哈夫曼編碼

public

static

byte

huffmanzip

(byte

bytes, map

pathcodes)

// 輸出哈夫曼編碼字串

system.out.

println

("哈夫曼編碼字串為"

+ huffmancodesstr.

tostring()

+"長度為:"

+ huffmancodesstr.

length()

);// 只是轉換成字串傳輸是不對的,之前長度40 現在133,變長了不合理。所以要每8位儲存為乙個byte,放到陣列中,返回

// 建立byte陣列進行接收-每8位算乙個

// 計算長度

int len;

len =

(huffmancodesstr.

length()

+7)/

8;// 很好的演算法

// len = huffmancodesstr.length() % 8 == 0 ? huffmancodesstr.length()/8:huffmancodesstr.length()/8+1;

byte

huffmancodesbytes =

newbyte

[len]

;int index =0;

// 遍歷字串,步長為8

// 建立接收子串的變數

string substr;

for(

int i =

0; i < huffmancodesstr.

length()

; i +=8)

else

// 將擷取下來的子串放到byte陣列中--注意解析時,radix引數設定成2 表示解析成二進位制,預設為10進製

huffmancodesbytes[index]=(

byte

) integer.

parseint

(substr,2)

; index++;}

return huffmancodesbytes;

}

資料壓縮,算術編碼

算術編碼的基本原理是將編碼的訊息表示成實數0和1之間的乙個間隔 interval 訊息越長,編碼表示它的間隔就越小,表示這一間隔所需的二進位制位就越多。算術編碼用到兩個基本的引數 符號的概率和它的編碼間隔。信源符號的概率決定壓縮編碼的效率,也決定編碼過程中信源符號的間隔,而這些間隔包含在0到1之間。...

資料壓縮 MPEG音訊編碼

一.實驗原理 2.mpeg 1音訊編碼器框架圖 多相濾波器組 polyphasefilter bank 將pcm 樣本變換到 32個子帶的頻域訊號 如果輸入的取樣頻率為 48khz 那麼子帶的頻率寬度為 48 2 32 0.75hz 心理聲學模型 psychoacousticmodel 計算訊號中不...

Huffman 編碼壓縮解壓

說明 某技校資料結構課作業 目前的演算法只對有規律的檔案有效。此處的規律指的是0x00到0xff的分布不均勻 txt檔案不論漢字還是英文有效。jpg,pdf壓縮無效。以下內容毫無邏輯,不具有參考價值。參考資料 思路建立 1.讀寫二進位制檔案file fi fopen origin.data rb f...