1. 程式人生 > >哈夫曼解碼編碼實現

哈夫曼解碼編碼實現

哈夫曼解碼編碼實現

課程:《程式設計與資料結構》
班級: 1723
姓名: 嚴域俊
學號:20172333
實驗教師:王志強
實驗日期:2018年12月08日
必修/選修:必修

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.實現過程體現:

  • 這一次任務是從檔案中獲取文字並實現哈夫曼樹,通過哈夫曼樹來進行編碼解碼的任務,首先就是建立一個結點類咯圖,這個結點類與其他二叉樹的類不同的地方在與多了一個變數就是權值,因為哈夫曼樹需要根據權值大小進行排序。圖

  • 然後就是關鍵的地方就是如何構建這個哈夫曼樹呢?
  • 哈夫曼樹是帶權路徑最短的樹,又叫做最優二叉樹,其實就是權值越高的越在樹根
  • 這個時候就是需要一個排序方法讓所有元素從小到大進行排序,每次挑選最小的兩個進行組合成新的元素,然後刪去這兩個元素,加入新的元素在進行排序,重複直到只剩下最大的那個作為哈夫曼樹的根。在這次實驗中我使用的排序方法是快速排序。圖

  • 然後就是給哈夫曼的每個數進行編碼,其實也很簡單,就是從根開始左邊為0右邊為1,直到每一個結束。圖

  • 其中還有一個步驟就是從檔案中取得資料,這個方法我直接在網上隨便找找就用了這個。圖

  • 最後就是根據編碼檔案返回賦值檔案,程式碼就是這個,沒什麼大的原理就是把編碼過程返回一下就這樣。

3.實驗過程中遇到的問題和解決過程

  • 問題1:使用檔案進行編碼的時候,發現呼叫不出來數值圖

  • 解答1:報錯資訊上顯示的是空指標,我心想什麼鬼啊又不是陣列,怎麼還空指標了,只是單純呼叫檔案裡的東西而已,想了很久,以為是toCharArray不能轉換這個數值型的東西,就去查這個方法的受用範圍,圖

,可是看了很久的確是用於String型的呀,難道我在編寫這個TXT檔案的時候加了標點符號?,最後檢查TXT文字的時候,發現我忘了儲存了,之前的輸入給我清理了。重新輸入之後就不再空指標了。

實驗碼雲地址

其他(感悟、思考等)

參考資料

Java 密碼學演算法