資料結構與演算法 十 之哈夫曼編解碼器

2021-10-02 20:19:05 字數 4223 閱讀 5883

具體過程

解壓huffman壓縮的優缺點

冠狀病毒肆虐,在家閒來無聊,複習了資料結構,寫了個huffman編解碼器。

git原始碼:

設計乙個中文**壓縮解壓程式需求如下:

以byte的形式讀取檔案的內容

統計各個byte出現次數

建立hufman樹

生成huffman編碼

壓縮儲存壓縮檔案

獲取huffman編碼表

根據編碼表生成解碼表

解壓儲存原始檔

/**

* @param fileurl 想要讀取的檔案路徑

* @return 檔案的內容

*/public

static string reader

(string fileurl)

br.close()

;}catch

(exception e)

return res.

tostring()

;}

//統計字元出現的次數

private map

statistics

(string data)

return res;

}

節點類如下:

public

class

node

/**

* 建立huffman樹

* 1. 將map中的值全變成node,放入優先佇列中

* 2. 優先佇列根據node中的value建立最小堆

* 3. 每次pop出最小的node,以這兩個node作為子節點組樹,兩個子節點的value的和作為父節點value的值

* 4. 迴圈直到佇列size==1

*/private node buildtree

(map

staticres)})

;//放入優先佇列

for(map.entry

entry : staticres.

entryset()

)//建樹

while

(priorityqueue.

size()

>1)

node root=priorityqueue.

poll()

;return root;

}

以遞迴的方式掃瞄

/**

* @param root huffman樹

* @return huffman編碼

*/private map

gethuffmanencoding

(node root)

private

void

buildmap

(node node,string encoding,map

result)

else

}

//資料根據huffman編碼變成0101的字串

public string datatobinary

(string data)

return res.

tostring()

;}

//0101字串轉byte陣列

public

byte

binarytobytearray

(string data)

/**

* @param url 寫入資料的url

* @param data 要寫入的資料

*/public

static

void

bytewriter

(string url,

byte

data)

fos =

newfileoutputstream

(file)

; fos.

write

(data)

; fos.

close()

;}catch

(exception e)

}

public

static

void

objectwriter

(string url,object obj)

//開啟檔案

fileoutputstream filestream=

newfileoutputstream

(url)

;//建立物件輸出流

objectoutputstream ostream=

newobjectoutputstream

(filestream)

;//寫入物件

ostream.

writeobject

(obj)

;//關閉物件輸出流

ostream.

close()

;//關閉檔案流

filestream.

close()

;}catch

(exception e)

}

/**

* @param url 讀取資料的url

* @return 位元組陣列

*/public

static

byte

bytereader

(string url)

byte

buffer = null;

try(fileinputstream fi =

newfileinputstream

(file)

)// 確保所有資料均被讀取

if(offset != buffer.length)

}catch

(exception e)

return buffer;

}

public

static object objectreader

(string url)

catch

(exception e)

return oneobject;

}

public

void

decoding()

}

//byte陣列轉0101字串

public

static string bytes2string

(byte

bts)

; stringbuilder out =

newstringbuilder()

;for

(byte b : bts)

return out.

tostring()

;}

//0101串更具huffman解碼還原資料

public string stringtodata

(string rawdata)

}return res.

tostring()

;}

/**

* @param url 檔案儲存路徑

* @param data 寫入檔案的資料

*/public

static

void

writer

(string url,string data)

writer =

newbufferedwriter

(new

filewriter

(file));

writer.

write

(data)

; writer.

flush()

; writer.

close()

;}catch

(exception e)

}

對文字的壓縮率很高。對非文字檔案幾乎沒有壓縮效果。

實現huffman編碼的基礎是統計源資料集中各訊號的概率分布。非文字檔案字元出現概率隨機,使用huffman編碼無法得到較好的壓縮效果

看資料結構之哈夫曼解碼

這個時間段不適合寫東西所以 就看書打發一下 隨手所致 只記錄下不適合做學習參考 下面來自 資料結構與演算法 語言版 在資料通訊,資料壓縮問題中,需要將資料檔案轉換成由 進製字元 組成的二進位制串,稱之為編碼。thinking 電腦裡檔案不都是 進製麼,於是我就勉為其難查查,看心情,心情好就解釋下 不...

哈夫曼樹編 解碼演算法

一 實驗目的 掌握哈弗曼編 解碼演算法。1.掌握huffman 樹的概念 特點和儲存結構 2.掌握huffman 樹的構造方法 3.學會靈活運用huffman 樹解決編碼問題。4.問題描述 5.某報文中共出現n個字元,各字元出現頻度依次為w1,w2,wn。要求設計乙個不等長的編碼方案,輸出每個字元對...

資料結構 哈夫曼樹與哈夫曼編碼

1 路徑 由乙個結點到另乙個結點之間的所有分支共同構成。2 路徑長度 結點之間的分支數目。3 樹的路徑長度 從樹的根結點到其他所有結點的路徑長度之和。4 權 賦予某一實體的值。在資料結構中,實體包括結點和邊,所以對應有結點權和邊權。5 結點的帶權路徑長度 結點與樹的根結點之間的路徑長度與結點權的乘積...