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