設有字符集:s=。
給定乙個包含26個英文本母的檔案,統計每個字元出現的概率,根據計算的概率構造一顆哈夫曼樹。
並完成對英文檔案的編碼和解碼。
要求:(1)準備乙個包含26個英文本母的英文檔案(可以不包含標點符號等),統計各個字元的概率
(2)構造哈夫曼樹
(3)對英文檔案進行編碼,輸出乙個編碼後的檔案
(4)對編碼檔案進行解碼,輸出乙個解碼後的檔案
(5)撰寫部落格記錄實驗的設計和實現過程,並將源**傳到碼雲
(6)把實驗結果截圖上傳到雲班課
滿分:6分。
huffmannode設計
public class node
public node(string data, int count)
public node(int count, node lchild, node rchild)
public node(
string data,
int count,
node lchild,
node rchild)
}
哈夫曼樹構造分為以下幾步:
統計出現的字元及頻率
將各個字元建立為葉子結點,頻率為結點的權值,用鍊錶儲存這些葉子結點
將結點佇列中的結點按權值公升序排列
取出權值最小的兩個結點構建父節點(要從鍊錶中刪除取出的結點),將新生成的父節點新增到結點鍊錶,並從新排序
重複4步驟,直到只剩下乙個結點
返回最後的結點,即為哈夫曼樹的根節點。
public void creathfmtree(string str)
編譯碼實現:
private string hfmcodestr = "";// 哈夫曼編碼連線成的字串
/*** 編碼
* @param str
* @return
*/public string tohufmcode(string str)
return hfmcodestr;
}/**
* * @param root 哈夫曼樹根節點
* @param c 需要生成編碼的字元
*/private void search(hnode root, string c)
}if (root.lchild != null)
if (root.rchild != null)
}// 儲存解碼的字串
string result="";
boolean target = false; // 解碼標記
/*** 解碼
* @param codestr
* @return
*/public string codetostring(string codestr)
end++;
}return result;
}/**
* 匹配字元哈夫曼編碼,找到對應的字元
* @param root 哈夫曼樹根節點
* @param code 需要解碼的二進位制字串
碼雲鏈結
哈夫曼編碼測試
1.定義 給定n個權值作為n個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。2.術語 01 路徑和路徑長度 定義 在一棵樹中,從乙個結點往下可以達到的孩子或孫子結點...
哈夫曼編碼測試
在計算機資料處理中,霍夫曼編碼使用變長編碼表對源符號 如檔案中的乙個字母 進行編碼,其中變長編碼表是通過一種評估 符號出現機率的方法得到的,出現機率高的字母使用較短的編碼,反之出現機率低的則使用較長的編碼,這便使編碼之後的字串的平均長度 期望值降低,從而達到無失真壓縮資料的目的。例如,在英文中,e的...
哈夫曼編碼測試
把字元從檔案中取出來,這是以前學過的io流實現的。統計出現的字元及頻率,將各個字元建立為葉子結點,頻率為結點的權值,用鍊錶儲存這些葉子結點。將所有帶權值的結點按權值從小到大排列 依次選取權值最小的結點放在樹的底部,權值小的在左邊 取出的結點相當於從這些結點的集合中剔除 生成乙個新節點作為這兩個結點的...