Prob_Solve 板


LINE

※ 引述《windows2k (KERORO軍曹)》之銘言: : ※ 引述《march20 ()》之銘言: : : 推 ericbibo:嗯~huffman's algorithm...每次都挑最小的兩個出來合併 07/08 21:02 : : 看到 n log n , 大膽猜看看. : : 我猜最佳合併法就是 s_x,...,s_m 和 s_(m+1),...,s_y 先各自合併, 接著再併起來. : 假設有這樣一個數列 : 10 7 2 4 12 6 : 用 huffman algorithm : 10 7 6 12 6 cost : 6 : 10 7 12 12 cost : 12 : 12 12 17 cost : 17 : 24 17 cost : 24 : 41 cost : 41 : Total Cost: 100 : 用版大的方法: : Total Sum: 41 : 所以我們要將 : (10 7 2) (4 12 6)分別進行合併 : (10 7 2) Total Cost: 28 : (4 12 6) Total Cost: 38 : 19 22 Cost : 41 : Total Cost: 107 : Optimal Solution: : 10 7 2 4 12 6 : 10 7 6 12 6 cost : 6 : 10 7 6 18 cost : 18 : 10 13 18 cost : 13 : 23 18 cost : 23 : 41 cost : 41 : Total Cost: 101 嗯, 看到這個 case, 給了我一個靈感 (先 po 出來看看) Huffman 找值最小的兩個來合併, 這裡似乎要找相鄰和最小的兩數來合併. 比如 10+7, 7+2, 2+4, 4+12, 12+6, 所以先拿 2,4 來合併. 然後 update heap 時, 要將影響到的鄰居一併 update 比如第一輪找到 2+4 為最小, 那就把 2+4 pop 出來, 這時影響到的 node 就是 7+2 和 4+12 要將這兩個值變成 7+6 和 6+12 然後調整 heap. 現在有兩件事要做 1. maintain min-heap, 但同時要讓 update 受到影響的 node 而且這個動作只能花 O(lg n) time. 2. 證明這樣可以找到 optimal solution. 第二項暫且按下, 先來看第一項. 首先 heap node 的內容得是 (x,y,i,j) 其中 x,y 為某相鄰兩數 (可能是之前併過的), i,j 為 左右鄰居在 heap 中的位置, 然後 node priority 為 x+y 比如 2+4 的 i 就是 7+2 在 heap 中的位置, j 就是 4+12 在 heap 中的位置. 現在 heap 的各構成動作修正如下: 1. Heap initialization: 首先對各相鄰兩數建出 heap node 並依數列順序放在 heap array 裡, 以上例來說 (10,7,0,2) (7,2,1,3) (2,4,2,4) (4,12,3,5) (12,6,4,0) 其中 0 代表這是最數序中左或最右一組數字. 接下來要調整 heap 內容, 就跟原本的 heap 一樣, 但調整 node 時, 要一併調整左右鄰居的 i 和 j, 比如在調整 (7,2,1,3) 時, 這個 node 會跟 (12,6,4,0) 對調, 因此 (7,2,1,3) 的位置從 2 變成 5, 所以 (10,7,0,2) (也就是位置是 1 的那個 node) 變成 (10,7,5,2) (2,4,2,4) (也就是位置是 3 的那個 node) 變成 (2,4,5,4) 同樣的, (12,6,4,0) 的位置從 5 變成 2, 同時 (4,12,3,5) (也就是位置 4 的那個 node) 變成 (4,12,3,2). 總之, 只要是移動 node 位置的動作, 就要調整左右鄰居的 i 和 j 值 (呃, 左右鄰居是對原數列來說, 而不是對 heap 來說) 很明類的, 每次移動一個 node, 只需要額外花 constant time 就可以 maintain 跟左右鄰居的關係, 整個 initialzation 依然控制在 n lg n time 內 2. Minimum value removal, 跟原來的 removal 相同, 但要 update 左右鄰居的值. 有件事要注意, min-value removal 發生在數字合併時. 先拿之前例子 (在 heapify 之前) 的內容來舉例, 比如 (10,7,0,2) 被移掉了, 也就是 10 和 7 先被合併, 接下來應該 update node 2 也就是 (7,2,1,3). 應該得變成 (17,2,0,3). (heapify 後 update 的動作跟這一樣, 但除了要修正 removal 所導致的空缺外, 還要調整左右鄰居的位置, 這個動作要 lg n 的時間). 每個 removal 依然維持在 lg n time. 至於 correctness, 嗯, 有空再來證, 直覺上是對的 (但也有可能是錯的 XD) --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 71.137.22.103 ※ 編輯: march20 來自: 71.137.22.103 (07/10 09:26) ※ 編輯: march20 來自: 71.137.22.103 (07/10 09:26) ※ 編輯: march20 來自: 71.137.22.103 (07/10 09:27) ※ 編輯: march20 來自: 71.137.22.103 (07/10 09:28)







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:iOS站內搜尋

TOP