合併果子

最爱丁珰發表於2024-05-09

藉助這一道題目來嚴謹證明一下Huffman樹的構造方法的正確性

對任意一顆\(k\)叉huffman樹,他都可以等價於一個類似於合併果子的過程,即每次取出最多\(k\)個點進行合併,然後\(k\)個點的權值和就是新的點的權值,然後把這個新的點加入決策集合,最終操作的只剩下一個點。不難證明,huffman樹所求的帶權路徑和就是合併過程中產生的每個點的點權和(包括最開始的點)

藍書上的關於最後一次不足\(k\)個的論點給了我們一個啟發:在huffman樹中(沒有新增權值為\(0\)的節點),除了倒數第二層(注意最後一層全部都是葉子)可能存在不滿\(k\)叉的節點,從第一層到倒數第三層的所有節點的叉數都是滿的;而倒數第二層也不會存在兩個點或以上不滿\(k\)叉,否則的話我們將這些點按順序排好權值和顯然不變,如下

而根據我們前面的等價,上述表述就是說明我們除了可能在第一次取的時候不取滿\(k\)個點,剩下的合併的時候都是一次性從決策集合裡面拿\(k\)個點出來的

我們再來考察取的過程。對於任意一種合併的方案,我們顯然是每次合併決策集合中最小的若干個點是最優的(用決策包容性證明,相當於越早合併被記錄的次數就越多)。那麼就可以構造出來一種方案了:根據我們上面的等價過程,我們只有在第一次的時候取不滿\(k\)個點,剩下的時候全部都從決策集合裡面拿\(k\)個點就好了。為了程式的一致性,我們在最開始的時候加入若干個零點就可以不用判斷邊界條件了

相關文章