哈夫曼編碼
time limit: 1000/2000 ms (c/others) memory limit: 32768/32768 k (c/others)
problem description:
由若干個值無重複的結點及其權值,建立相應的哈夫曼樹。在合併過程中,若出現權值相同的情況,則優先選取編號小的進行合併;要求哈夫曼樹中所有左孩子編號小於右孩子編號(以結點的輸入順序做為其編號)。對所建的哈夫曼樹,根據左0右1的原則,對各結點進行編碼。設計乙個演算法,對給定的若干碼串進行相應的解碼,並輸出解碼結果。
input:
有多組測試資料,每組資料由結點資訊和碼串兩部分組成。結點資訊部分的第一行為乙個整數n(n<=20),表示以下有n個結點資訊,每個結點資訊包括乙個字元和乙個整數,表示結點值和權值;碼串部分的第一行為乙個整數m,表示以下有m個碼串(每個串長不超過100),碼串由0和1構成,且均有效。
output:
輸出各碼串對應的解碼結果,每個解碼結果佔一行,每組測試資料後有一空行。
sample input:4a7
g5o2d42
10110110111
11111010
sample output:
good
dog
#include
#include
#include
using
namespace std;
struct hf
;int i1,i2;
void
select
(hf huff,
int k)
}for
(int i=i1+
1;i)break;}
}// cout(int i=i1;i)else
if(huff[i]
.weight>=min&&huff[i]
.weightif(min==cmin)
}int
main()
for(
int i=
0;i<
2*n-
1;i++
)for
(int k=n;k<
2*n-
1;k++
)for
(int i=
0;i)else
if(huff[p]
.r==c)
c=p;
}// cout<}
cin>>m;
while
(m--)}
if(z==-1
)//因為是哈夫曼樹,每個葉子節點都是data的節點,所以每個data的編碼都一樣,
//不存在哪個data的編碼是另乙個data的字首,導致多種解碼情況。}}
cout<} cout<}return0;
}
測試資料:4a7
g5o2d42
10110110111
111110106a2
b3c5
d8e4f41
01010103b4
e2f3
4000
1101011
1110011
第一次寫的時候沒有對huff[i].b(huff[i]的編碼的逆序儲存)進行初始化,導致輸入不同的測試資料是出錯。我以為每次輸入n再建立huff陣列就不用對b進行初始化了。
生成樹和判斷等都可以寫成函式,但我的初始化和傳遞值有點麻煩
哈夫曼樹及哈夫曼編碼
哈夫曼樹,最優二叉樹,帶權路徑長度 wpl 最短的樹。它沒有度為1的點,是一棵嚴格的二叉樹 滿二叉樹 了解哈夫曼樹,我們首先要知道樹的幾個相關術語,並了解什麼是wpl。注 樹的wpl這個概念非常重要,這個公式直接產生了哈夫曼編碼資料壓縮的應用 根據給定的n個權值構成n棵二叉樹的集合f 其中每棵二叉樹...
哈夫曼樹及哈夫曼編碼
給定n個權值作為n個葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。樹節點間的邊相關的數叫做權。從樹中的乙個節點到另乙個節點之間的分支構成兩個點之間的路徑,路徑上的分支數目...
哈夫曼樹及哈夫曼編碼 C
說明 1.讀取檔案中需進行哈夫曼編碼的資料資訊 2.構造生成單節點二叉樹組 森林 3.構造哈夫曼樹 4.進行哈夫曼編碼 5.輸出對應資料及其編碼 include include includeusing namespace std const int max n 100 最大容量 const int...