1. 程式人生 > 實用技巧 >20192328牛梓萌 2019-2020-1 《資料結構與面向物件程式設計》哈夫曼編碼實踐

20192328牛梓萌 2019-2020-1 《資料結構與面向物件程式設計》哈夫曼編碼實踐

20192328牛梓萌 2019-2020-1 《資料結構與面向物件程式設計》哈夫曼編碼實踐
課程:《程式設計與資料結構》
班級: 1923
姓名: 牛梓萌
學號:20192328
實驗教師:王志強
實驗日期:2019年12月19日
必修/選修: 必修

1.實驗內容

設有字符集:S={a,b,c,d,e,f,g,h,i,j,k,l,m,n.o.p.q,r,s,t,u,v,w,x,y,z}。
給定一個包含26個英文字母的檔案,統計每個字元出現的概率,根據計算的概率構造一顆哈夫曼樹。
並完成對英文檔案的編碼和解碼。
要求:
(1)準備一個包含26個英文字母的英文檔案(可以不包含標點符號等),統計各個字元的概率
(2)構造哈夫曼樹
(3)對英文檔案進行編碼,輸出一個編碼後的檔案
(4)對編碼檔案進行解碼,輸出一個解碼後的檔案
(5)撰寫部落格記錄實驗的設計和實現過程,並將原始碼傳到碼雲
(6)把實驗結果截圖上傳到雲班課

2. 實驗過程及結果

構造哈夫曼樹

將老師釋出到雲班課的哈夫曼樹程式碼稍作修改即可




對於測試方面

·讀取和寫檔案的操作
(準備三個檔案,一個用來讀入檔案中的內容,一個用來編碼,一個用來解碼)

File file = new File("/Users/haha/Desktop/Huffman.txt");
        if(!file.exists()){
            file.createNewFile();
        }
File file2 = new File("/Users/haha/Desktop/enHuffman.txt");
        Writer writer = new FileWriter(file2);
        writer.write(result1);
        writer.close();
File file3 = new File("/Users/haha/Desktop/deHuffman.txt");
        Writer writer1 = new FileWriter(file3);
        writer1.write(result2);
        writer.close();

·對於文字讀寫

File file = new File("/Users/haha/Desktop/Huffman.txt");
        if(!file.exists()){
            file.createNewFile();
        }

        Reader reader = new FileReader(file);
        BufferedReader bufferedReader = new BufferedReader(reader);
        String temp = bufferedReader.readLine();

·對於頻率的計算

for (int j = 97; j <= 122; j++) {
            int number = 0;//給字母計數
            for (int m = 0; m < characters.length; m++) {
                if (characters[m] == (char) j) {
                    number++;
                }
                frequency[j - 97] = (float) number / characters.length;
            }
        }

·對於編碼

String result1 = "";
        List<HuffNode> temp1 = breadthFirstTraversal(root);

        for (int i = 0; i < characters.length; i++) {
            for (int j = 0; j < temp1.size(); j++) {

                if (characters[i] == temp1.get(j).getData()) {
                    result1 += temp1.get(j).getCodenumber();
                }
            }
        }

·對於解碼

String result2 = "";
        String current="";
        while(secretText.size()>0) {
            current = current + "" + secretText.get(0);
            secretText.remove(0);
            for (int p = 0; p < newlist1.size(); p++) {
                if (current.equals(newlist1.get(p))) {
                    result2 = result2 + "" + newlist.get(p);
                    current="";
                }

·實驗結果

其他(感悟、思考等)
對於哈夫曼樹的編寫首先要理解哈夫曼樹的形成過程,參考老師的程式碼給了很大的幫助,在此基礎上再增加對於檔案的讀取等操作。

參考資料

《Java程式設計與資料結構教程(第二版)》

《Java程式設計與資料結構教程(第二版)》學習指導