問題 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轉換為語法分析樹。今天我...