哈夫曼樹生成優化與哈夫曼編碼的實現

2021-10-05 19:56:12 字數 2398 閱讀 1572

//哈夫曼樹結點結構

huffnode;

typedef

struct

huffcode;

void

select

(huffnode hufftree,

int k,

int& i1,

int& i2)

for(j = i +

1; j < k; j++)if

(hufftree[j]

.parent ==-1

)for

(i =

0; i < k; i++)if

((hufftree[i]

.parent ==-1

)&&(hufftree[i]

.weight < hufftree[i1]

.weight)

&&(i2 != i)

)for

(j =

0; j < k; j++)if

((hufftree[j]

.parent ==-1

)&&(hufftree[j]

.weight < hufftree[i2]

.weight)

&&(i1 != j))}

void

huffmantree

(huffnode hufftree,

int n)

#if 0

for(k = n; k <

2* n -

1; k++

)#else

//優化演算法

/* // 基本思想:先排序,然後每次前面在順序取權值,k+1和後面新增的比較,

// 如果前面k+1比後面小,取前面k 和 k+1,且取完相加等到新的 i_12,

// 如果後面的比k+1小,則取k 和 後面的 i_12-1 相加得到新的i_12

1. 排序

2. 依次選2個相加得到最小權值

2.1 判斷k++是否 大於等於n,如果是則退出

*/// 排序

huffnode temp;

for(

int i =

0; i < n -1;

++i)}}

int i1, i2;

// i1, i2 之和的下標

int i_12 = n -1;

for(k =

0; k < n ; k++

)else}}

hufftree[i_12]

.weight = hufftree[i1]

.weight + hufftree[i2]

.weight;

hufftree[i1]

.parent = i_12; hufftree[i2]

.parent = i_12;

hufftree[i_12]

.lchild = i1; hufftree[i_12]

.rchild = i2;

}#endif

}char

*strcut

(char

* dest,

char

* src,

int start)}}

else

return dest;

}void

encoding

(huffnode ht[

], huffcode hcd,

int n)

//hcd[i] = strcpy(hcd[i].cd, &cd[start])

char

* dest = new char

[n - hcd[i]

.start]

; dest =

strcut

(dest, hcd[i]

.cd, hcd[i]

.start)

; cout << ht[i]

.data <<

": "

<< dest << endl;}}

intmain()

huffmantree

(hufftree, n)

;//構造哈夫曼樹

encoding

(hufftree, hcd, n)

;//求得哈夫曼樹hufftree的對應的哈夫曼編碼,並輸出每個葉子結點的哈夫曼編碼

return0;

}

哈夫曼樹與哈夫曼編碼

在一般的資料結構的書中,樹的那章後面,著者一般都會介紹一下哈夫曼 huffman 樹和哈夫曼編碼。哈夫曼編碼是哈夫曼樹的乙個應用。哈夫曼編碼應用廣泛,如 jpeg中就應用了哈夫曼編碼。首先介紹什麼是哈夫曼樹。哈夫曼樹又稱最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的...

哈夫曼樹與哈夫曼編碼

1.哈夫曼 huffman 編碼是哈夫曼樹的乙個應用。2.哈夫曼樹又稱為最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的葉結點的相對值乘上其到根結點的路徑和權值。3.影象jpg就是利用了哈夫曼編碼。4.哈夫曼樹是最優二叉樹,子樹有左右次序之分。5.哈夫曼樹的形態不是唯...

哈夫曼樹與哈夫曼編碼

哈夫曼樹是一種簡單的樹結構,建樹過程如下 給出一組資料,不斷選擇最小的兩個數,並用兩個數的和作為它們的parent節點,再從資料中刪除這兩個數,將兩個數的和加入資料中,直到所有的資料都被加入樹結構,形成一顆樹。這顆樹的所有非葉子節點都有兩個child,兩個child的值的和則是這個節點的值,根節點是...