使用優先佇列實現,需要注意以下幾點:
1.在使用priority_queue時,內部需要儲存哈夫曼樹節點的指標,而不能是節點。因為構建哈夫曼樹時,需要把其左右指標指向孩子,而如果儲存的是節點,那麼孩子的位址是會改變的。同理節點應當使用new在記憶體中開闢,而不能使用vector,原因是vector在陣列大小為2整數次冪時,大小會倍增,開闢新陣列並把老陣列的數字copy過去,從而也會導致位址變化。
2.優先佇列對指標的排列,需要額外寫乙個比較函式來比較指標指向的節點的大小。bool operator () (wcnode * node1, wcnode * node2) return node1->lessthan(node2);並在定義優先佇列時使用這種方法: priority_queue , compare> 第乙個引數是節點型別,第二個引數是優先佇列的儲存結構,第三個引數是比較函式。
3.c++在寫入檔案時,由於只能按位元組寫入,因此需要把8個bit位轉化為乙個位元組,最後不足8位用0補齊,並記錄檔案總bit數,便於解碼。然後寫入檔案。另寫入二進位制檔案可以使用ofstream out("output.txt",std::ofstream::binary);
4.哈夫曼編碼資訊包括每種字元的對映,和該檔案的總bit數。
其**如下:
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9view codeusing
namespace
std;
10class
compare;
1112
class
wcnode
1324 wcnode(char w='
\0', int c=0, wcnode* l=null, wcnode * r=null)
2528
};29
30class
compare
3137
};38
39void preorder(wcnode *head, vector rec, map > &res)
4046 vector l =rec;
47 l.push_back(0
);48 vector r =rec;
49 r.push_back(1
);50
if(head->left != null) preorder(head->left, l, res);
51if(head->right != null) preorder(head->right, r, res);52}
53 map > encode(map &wordcount)
5468
while( pq.size() > 1)69
80 wcnode *huffmanhead =pq.top();
81 vectorrec;
82preorder(huffmanhead, rec, res);
83 map >::iterator it;
84for( it = res.begin() ; it != res.end() ; it++)
8591 cout<
;92}93
return
res;94}
9596
void output(string s, string passage, map >res)
97107
}108
char outputchar = 0
;109
for( int i = 0 ; i < bit.size() ; i++)
110116 outputchar = outputchar +bit[i];
117 outputchar = outputchar * 2
;118
}119
if( outputchar != 0
)120
123out
.close();
124}
125int main(int argc, char *ar**)
126139
else
140143
}144 res =encode(wordcount);
145 output("
outaesop.txt
", passage, res);
146in
.close();
147 }
Huffman coding哈夫曼編碼
description in computer science and information theory,a huffman code is an optimal prefix code algorithm.in this exercise,please use huffman coding t...
哈夫曼編碼 哈夫曼樹
1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....
哈夫曼樹 哈夫曼編碼
定義從a結點到b結點所經過的分支序列為從a結點到b結點的路徑 定義從a結點到b結點所進過的分支個數為從a結點到b結點的路徑長度 從二叉樹的根結點到二叉樹中所有結點的路徑長度紙盒為該二叉樹的路徑長度 huffman樹 帶權值路徑長度最小的擴充二叉樹應是權值大的外界點舉例根結點最近的擴充二叉樹,該樹即為...