今天數算課講huffman樹,是基於堆實現的,突然想起以前實現過基於雙佇列的huffman樹,做個回顧。
首先將n個元素從小到大排序,基於比較的排序都是nlogn的複雜度,這裡可以考慮用計數排序(即桶排序)或者基數排序嘗試優化到n試試。
然後我們獲得了乙個有序佇列我們把它放在a佇列中,然後再找乙個空的b佇列。
然後從a中或者b中找出兩個最小的元素,累加放入b佇列的隊尾加入。不難發現b佇列也是遞增的。這樣模擬每次取最小的兩個。
仔細一想,原先需用插入堆中,動態詢問最小值的問題,被我們用雙佇列取代了,之所以能用雙佇列實現,
因為這個問題特殊在它每次產生的新的數是由兩個最小的數產生的,這樣使得產生的值都是遞增的。因此才可以用雙佇列去優化它。
// 雙佇列實現huffman樹
#include #include #include #include #include #include using namespace std;
const int maxn = 100+5;
int test,n,a[maxn];
queueqa,qb;
int get()
if (qa.empty())
if (qa.front() < qb.front()) else
return t;
}int main()
cout << sum << endl;
} return 0;
}
Huffman樹的實現
huffmantree.h inte ce for the huffmantree class.if defined afx huffmantree h e2fe6c12 c0a9 4483 af1b 9623f1fd0ef8 included define afx huffmantree h e2...
Huffman樹與MinHeap實現
ifndef min heap define min heap define max size 256 template class minheap private int left int curr int right int curr int parent int curr t a max si...
Huffman樹編碼 DFS實現
通過寫這個編碼和huffman樹的構建,讓我對huffman tree 有了更深的理解 1 首先huffman是經過n 1次迭代之後生成的樹,所以如果開始的節點有n個的話,那麼生成之後的的樹的節點個數是2 n 1 2 編碼的話可以用dfs處理 3 樹的節點新加了乙個parents值,讓我學到了一種新...