設有字符集:s=。
給定乙個包含26個英文本母的檔案,統計每個字元出現的概率,根據計算的概率構造一顆哈夫曼樹。
並完成對英文檔案的編碼和解碼。
要求:(1)準備乙個包含26個英文本母的英文檔案(可以不包含標點符號等),統計各個字元的概率
(2)構造哈夫曼樹
(3)對英文檔案進行編碼,輸出乙個編碼後的檔案
(4)對編碼檔案進行解碼,輸出乙個解碼後的檔案
**如下,詳細請看注釋:
public static void main(string args) throws ioexception ;
//開乙個和26個字母對應的陣列,拿來統計頻數每個字母出現的
double sum = new double[26];
//count是記錄所有字母出現總次數的
int count = 0;
//遍歷第二個陣列來初始化
for (int i = 0; i < 26; i++)
//從charfile.txt檔案中讀取出內容,存入string型的result變數中
file file = new file("c:\\users\\leon\\ideaprojects\\leon\\huffmancode", "charfile.txt");
reader reader2 = new filereader(file);
string result = "";
while (reader2.ready())
//將result中的字串轉換成乙個個字元
char text = result.tochararray();
//統計每個字母出現次數到第二個陣列中
for (int j = 0; j < text.length; j++) }}
//將頻數除總數成了頻率,再存入第二個陣列
for (int i = 0; i < sum.length; i++)
}
public class node
}
public class harf
return nodes.get(0);
}//快速排序
public static void quicksort(listnodes)
private static void subsort(listnodes, int start, int end) else
}swap(nodes, start, j);
//遞迴左邊子串行
subsort(nodes, start, j - 1);
//遞迴右邊子串行
subsort(nodes, j + 1, end);}}
//用於交換結點的方法
private static void swap(listnodes, int i, int j)
//用遞迴給每個結點編碼
public void setcode(node root)
if (root.rightchild != null)
}//輸出編碼結果
public void output(node root)
if (root.leftchild != null)
if (root.rightchild != null)
}// 哈夫曼編碼連線成的字串
private string hfmcodestr = "";
//編碼
public string tohufmcode(string str,node root)
return hfmcodestr;
}//匹配並拼接編碼後的結果
private void search(node root, char c)
}if (root.leftchild != null)
if (root.rightchild != null)
}string result="";
boolean target = false; // 解碼標記
//將編碼轉換成字串
public string codetostring(string codestr,node root)
end++;
}return result;
}//匹配解碼
private void matchcode(node root, string code)
}if (root.leftchild != null)
if (root.rightchild != null) }}
在上面的驅動類主函式中新增如下**:
//採用佇列結構
listnodes = new arraylist<>();
for (int i = 0; i < sum.length; i++)
harf h = new harf();
node root = h.createtree(nodes);
h.setcode(root);
h.output(root);
string s = h.tohufmcode(result, root);
system.out.println(s);
//將編碼結果寫入第二個檔案
file file1 = new file("c:\\users\\leon\\ideaprojects\\leon\\huffmancode", "charfile2.txt");
writer writer2 = new filewriter(file1);
bufferedwriter bufferedwriter = new bufferedwriter(writer2);
bufferedwriter.write("編碼後的哈夫曼為"+s, 0, s.length());
bufferedwriter.flush();
bufferedwriter.close();
string a ="哈夫曼解碼後"+h.codetostring(s,root);
//將解碼結果寫入第三個檔案
哈夫曼編碼 哈夫曼樹
1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....
哈夫曼樹 哈夫曼編碼
定義從a結點到b結點所經過的分支序列為從a結點到b結點的路徑 定義從a結點到b結點所進過的分支個數為從a結點到b結點的路徑長度 從二叉樹的根結點到二叉樹中所有結點的路徑長度紙盒為該二叉樹的路徑長度 huffman樹 帶權值路徑長度最小的擴充二叉樹應是權值大的外界點舉例根結點最近的擴充二叉樹,該樹即為...
哈夫曼編碼 哈夫曼樹
哈夫曼樹是乙個利用權值進行優化編碼的乙個比較奇怪的樹,他的實現比較簡單,用途也比較單一。哈夫曼樹的實現,實現要求 通過哈夫曼樹可以保證在編碼過程中不會出現例如 1000和100這樣的編碼規則,否則就會編碼失敗,因為1000和100在某些情況下的編碼會一模一樣。通過哈夫曼樹可以保證權值大的值進行編碼時...