赫夫曼編碼

2022-07-12 23:00:29 字數 4016 閱讀 7623

public

class

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...