publicclass
huffmancode
/*** 解壓檔案**
@param
zipfile 準備解壓的檔案
* @param
dstfile 檔案解壓路徑
*/public
static
void
unzipfile(string zipfile, string dstfile)
catch
(exception e)
finally
catch
(ioexception e) }}
/*** 檔案壓縮**
@param
srcfile 原檔案路徑
* @param
dstfile 壓縮檔案目錄
*/public
static
void
zipfile(string srcfile, string dstfile)
catch
(exception e)
finally
catch
(exception e) }}
/***
@param
huffmancodes 赫夫曼編碼表
* @param
huffmanbytes 赫夫曼編碼得到的位元組陣列
* @return
原來字串對應的陣列
*/private
static
byte decode(maphuffmancodes, byte
huffmanbytes)
//把字串按照指定的赫夫曼編碼進行解碼
//把赫夫曼編碼表反向轉換,因為需要反向查詢
mapmap = new hashmap<>();
for (map.entryentry : huffmancodes.entryset())
//建立集合存放byte
listlist = new arraylist<>();
for (int i = 0; i else}}
system.out.println(list);
byte decodebytes = new
byte
[list.size()];
for (int i = 0; i < list.size(); i++)
return
decodebytes;
}/***
@param
flag 標識是否需要補高位,如果是最後乙個位元組,無需補高位
* @param
b *
@return
b對應的二進位制的字串(注意是按補碼返回)
*/private
static string bytetobit(boolean flag, byte
b) string str = integer.tobinarystring(temp);//
返回的是temp對應的二進位制的補碼
if(flag)
else
}/*** 封裝**
@param
bytes 原始字串對應的位元組陣列
* @return
經過赫夫曼編碼後的位元組陣列
*/private
static
byte huffmanzip(byte
bytes)
/*** 將字串通過生成的赫夫曼編碼表返回赫夫曼編碼壓縮後的byte陣列**
@param
bytes 原始的字串陣列對應的byte陣列
* @param
huffmancodes 生成的赫夫曼編碼表
* @return
bytehuffmancodebytes, 即8位對應乙個byte,放入到huffmancodebytes
* huffmancodebytes[0] = 10101000 =>byte[推導 10101000=>10100111(反碼)=>11011000]
*/private
static
byte zip(byte bytes, maphuffmancodes)
//統計返回的長度
//int len = (stringbuilder.length() + 7) / 8;
intlen;
if (stringbuilder.length() % 8 == 0)
else
//建立儲存壓縮後的byte陣列
byte huffmancodebytes = new
byte
[len];
int index = 0;//
記錄第幾個byte
for (int i = 0; i < stringbuilder.length(); i = i + 8)
else
//將strbyte轉成乙個byte,放入到huffmancodebytes
huffmancodebytes[index] = (byte) integer.parseint(strbyte, 2);
index++;
}return
huffmancodebytes;
}//生成赫夫曼編碼表
//1、將赫夫曼編碼表放在map中
static maphuffmancodes = new hashmap<>();
//2、拼接路徑,定義乙個stringbuilder儲存某個葉子節點的路徑
static stringbuilder stringbuilder = new
stringbuilder();
//為了呼叫方便,過載getcodes方法
private
static mapgetcodes(node root)
getcodes(root.left, "0", stringbuilder);
getcodes(root.right, "1", stringbuilder);
return
huffmancodes;
}/***
@param
node 傳入節點
* @param
code 路徑:左子節點0,右子節點1
* @param
stringbuilder 用於拼接路徑
*/private
static
void
getcodes(node node, string code, stringbuilder stringbuilder)
else}}
private
static listgetnodes(byte
bytes)
else
}//將map轉成node物件,並加入nodes集合中
for (map.entryentry : counts.entryset())
return
nodes;
}public
static node createhuffmantree(listnodes)
//最後剩下的節點為赫夫曼樹的根節點
return nodes.get(0);
}private
static
void
preorder(node root)
else
}}class node implements comparable
@override
public
string tostring() ';
}@override
public
intcompareto(node o)
//前序遍歷
public
void
preorder()
if (this.right != null
) }
}
赫夫曼編碼
include include using namespace std typedef struct htnode,huffmantree 動態分配陣列儲存赫夫曼樹 typedef char huffmancode 動態分配陣列儲存赫夫曼編碼 赫夫曼編碼的演算法實現 void sethuffmant...
赫夫曼編碼
用赫夫曼樹進行編碼是我們處理資料壓縮常用的方法。請同學們用赫夫曼編碼方法儲存你班同學 資料結構 課程的期終考試成績。include include include include define ok 1 define maxnn 100000 typedef struct studentstuden...
赫夫曼編碼
問題r 赫夫曼編碼 思路 對於赫夫曼來說,往左走為0,往右走為1,可以發現每一位就往下走一層。因此整體報文的長度可以用不同報文在樹中的位置來確定,也就是說,符號種類 每個符號在樹中的深度即為整體報文的長度 而ascll碼的位元位長度為符號個數 8 include include include us...