具體過程
解壓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 結點的帶權路徑長度 結點與樹的根結點之間的路徑長度與結點權的乘積...