簡體   English   中英

我不明白這個霍夫曼算法的實現

[英]I don't understand this Huffman algorithm implementation

    template<class T>
    void huffman(MinHeap<TreeNode<T>*> heap, int n)
    {
      for(int i=0;i<n-1;i++)
      {
        TreeNode<T> *first = heap.pop();
        TreeNode<T> *second = heap.pop();
        TreeNode<T> *bt = new BinaryTreeNode<T>(first, second, first.data, second.data);
        heap.push(bt);
      }
    }

在我的C ++數據結構基礎教科書中,它給出了霍夫曼編碼的2頁定義,以及上面的代碼。 對我來說,這本書不夠詳細,所以我已經完成了谷歌搜索,我學會了霍夫曼編碼的過程。 教科書聲稱在上面的代碼末尾,制作了霍夫曼樹。 但對我來說這似乎是錯誤的,因為一個霍夫曼樹,不一定是一個完整的樹,但由於heap.push()上面的代碼似乎總是給出一個完整的樹。 那么有人可以向我解釋這段代碼是如何沒有錯的嗎?

堆的樹結構不一定與得到的霍夫曼樹匹配 - 相反,堆包含部分霍夫曼樹的森林,最初每個樹由單個符號節點組成。 然后,循環重復獲取具有最小權重的兩個節點,將它們組合成一個節點,並將得到的組合節點放回。 在進程結束時,堆包含一個完成的樹。

霍夫曼編碼通過在每一步取兩個最低值項來工作。 當您第一次調用該函數時(因為您的MinHeap按值排序),彈出兩個最低值的項並“合並”到一個決策節點中,然后將該節點放回堆中。 該節點按其子分數的總和進行評分並放回堆中。 將其插回堆中會根據其得分將其放入正確的位置; 如果它仍然低於任何其他項目,它將是第一個,否則它將在其他地方。

所以這個算法是從下到上構建樹,當你清空堆時,你將擁有一個完整的樹。 但我不明白'n'是什么意思; 循環應該是while (heap.size() > 1) 無論如何,樹不是“滿”,不同的分支將是不同的長度,這取決於初始堆中的項目的頻率如何評分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM