赫夫曼編碼

2021-10-19 17:27:52 字數 1888 閱讀 8567

在通常

1.首先我們要建立乙個(節點類node)定義樹中節點的屬性,屬性有:存放字元資料變數,存放權值變數,左路徑,右路徑。

// 繼承comparable類,用於使用裡面的排序方法

public

class

node

implements

comparable

// 使用comparable裡的方法進行公升序排序

@override

public

intcompareto

(node o)

@override

public string tostring()

// 前序遍歷

public

void

preorder()

if(this

.right != null)

}}

2.再定義乙個字元型別陣列,用於裝字串中的每個字元

public

static

void

main

(string[

] args)

將字元陣列中的元素轉化成節點,並儲存到集合中:

1.1.首先定義乙個arraylist

1.2.然後定義乙個map的變數來接收hashmap型別資料,其中byte型別表示為nodes資料內容,integer表示為次數

2.1.然後用迴圈遍歷字元陣列(bytes)

2.2.迴圈體內先用前面宣告的型別integer定義變數count迴圈獲取字元的出現次數

2.3.因為有可能獲取到,有可能獲取不到,所以再判斷count是否等於空

為空的話表示map還沒有整個字元資料,則第一次新增次數為1:counts.put(b,1)

反之表示不是第一次則 再原來的基礎上++

3.1.遍歷完後把每個字元與屬性內容轉成節點 node物件,並加入到nodes集合中

迴圈遍歷map,原理和 for(型別 下標變數 : 變數目標) 一樣

public

static arraylist

getnodes (

byte

bytes)

else

}// 3.1

for(map.entry

entry: counts.

entryset()

)return nodes;

}

根據arraylist集合建立乙個對應的赫夫曼樹

1.1因為數列裡的節點一直相加 去除 新增 到最後只剩下最後的乙個節點,就是根節點,所以使用while

迴圈的條件為:當集合的長度大於1時迴圈

1.2迴圈中先使用collections.sort()方法進行公升序排序

1.3然後定義節點變數leftnode與rightnode儲存集合中的最小值和次小值,也就是排序後集合的第0個與第1個節點

1.4並建立 new出根節點parent,並且它的根節點只有權值沒有字元或ascii碼,所以data部分為空,

權值為leftnode與rightnode權值相加:node parent = new node(null,leftnode.weight + rightnode.weight);

1.5並且根節點左右路徑鏈結上leftnode與rightnode

1.6然後使用集合中的方法,從集合中去除掉處理過的節點,並加入相加出來的根節點parent到集合中

private

static node createhuffmantree

(arraylist

nodes)

return nodes.

get(0)

;}

赫夫曼編碼

include include using namespace std typedef struct htnode,huffmantree 動態分配陣列儲存赫夫曼樹 typedef char huffmancode 動態分配陣列儲存赫夫曼編碼 赫夫曼編碼的演算法實現 void sethuffmant...

赫夫曼編碼

用赫夫曼樹進行編碼是我們處理資料壓縮常用的方法。請同學們用赫夫曼編碼方法儲存你班同學 資料結構 課程的期終考試成績。include include include include define ok 1 define maxnn 100000 typedef struct studentstuden...

赫夫曼編碼

問題r 赫夫曼編碼 思路 對於赫夫曼來說,往左走為0,往右走為1,可以發現每一位就往下走一層。因此整體報文的長度可以用不同報文在樹中的位置來確定,也就是說,符號種類 每個符號在樹中的深度即為整體報文的長度 而ascll碼的位元位長度為符號個數 8 include include include us...