問題 B 演算法6 13 自頂向下的赫夫曼編碼

2021-10-02 18:59:53 字數 2110 閱讀 5595

問題 b: 演算法6-13:自頂向下的赫夫曼編碼

[命題人 : 外部匯入]

時間限制 : 1.000 sec 記憶體限制 : 32 mb

題目描述

在本題中,我們將要討論的是自頂向下的赫夫曼編碼演算法。從根出發,遍歷整棵赫夫曼樹從而求得各個葉子結點所表示的字串。演算法的關鍵部分可以表示如下:

在本題中,讀入n個字元所對應的權值,生成赫夫曼編碼,並依次輸出計算出的每乙個赫夫曼編碼。

輸入輸入的第一行包含乙個正整數n,表示共有n個字元需要編碼。其中n不超過100。

第二行中有n個用空格隔開的正整數,分別表示n個字元的權值。

輸出共n行,每行乙個字串,表示對應字元的赫夫曼編碼。

樣例輸入 

85 29 7 8 14 23 3 11

樣例輸出

0110

101110

1111

11000

0111

010

#include

#include

#include

#include

using std::swap;

using std::strcpy;

typedef

char

*huffmancode;

const

int maxn =

110;

typedef

struct

huffmannode,

*huffmantree;

void

selectmin

(huffmantree ht,

int n,

int&s1,

int&s2)

} min = int_max;

for(

int i =

1; i <= n;

++i)}if

(s1 > s2)

}//無棧非遞迴遍歷哈夫曼樹,求哈夫曼編碼

void

huffmancoding

(huffmantree &ht, huffmancode *

&hc,

int w,

int n)

for(

int i = n +

1; i <= m;

++i)

//構建哈夫曼樹

for(

int i = n +

1; i <= m;

++i)

hc =

new huffmancode[n +1]

;char

* cd =

newchar

[n];

int c = m;

int cdlen =0;

cd[n -1]

='\0'

;for

(int i =

1; i <= m;

++i)

while

(c)else

if(ht[c]

.rchild ==0)

}else

if(ht[c]

.weight ==1)

}else

}delete

cd;}int

main

(int argc,

char

const

*ar**)

huffmancoding

(ht, hc, data, n)

;for

(int i =

1; i <= n;

++i)

delete

(hc)

;delete

(ht);}

return0;

}/*input:

85 29 7 8 14 23 3 11

output:

0110

101110

1111

11000

0111

010 */

伸展樹 (自頂向下的設計)

伸展樹的設計有兩種設計模式,第一種 自低向上的設計方式,第二種 設計方式 自頂向下的設計方式,對於由低向上的設計,每乙個結點樹保留指向其父結點的的額外的結點,第二種方式由sedgewick 大神的 演算法 一書感謝這一 位大神。伸展樹又叫自適應查詢樹,實質上二叉搜尋樹的的變形,允許各種型別的二叉樹操...

0 1揹包自頂向下非遞迴演算法

0 1揹包動態演算法 給出兩點地傑斯特拉演算法滿足動態規劃演算法的需求 a 到 b c d e f h 已知學生家的距離,求老師家到每個學生家的最短路徑,好讓王老師做出計畫 寫出0 1揹包自頂向下的非遞迴動態規劃演算法 include include using namespace std int ...

簡述自頂向下的語法分析

在我們得到了context free grammar 之後,下一步就要將它轉換成一棵語法分析樹了,語法分析樹使得我們的編譯器能夠識別輸入串是否符合我們的context free grammar 中文翻譯為上下文無關語言 有兩種方法能夠將context free grammar轉換為語法分析樹。今天我...