簡體   English   中英

配對數字的貪心算法使最大和最小化

[英]Greedy algorithm to pair numbers that minimizes the maximum sum

輸入是一個實數序列 x1, x2, ..., x2n。 我們想將這些數字配對成 n 對。 對於第 i 對 (i = 1, 2, ..., n),令 Si 表示該對中數字的總和。 (例如,如果將 x(2i−1) 和 x2i 作為第 i 對配對,則 Si = x(2i−1) + x2i)。 我們想對這些數字進行配對,以使 Maxi[Si] 最小化。 設計一個貪心算法來解決這個問題。


這就是問題所在; 我的解決方案是簡單地對數字進行排序並將第一個元素與最后一個元素配對並加一/減一索引並重復。 該算法會嘗試針對每一對進行優化,使其變得貪婪。 我只是想知道是否有一個線性時間算法可以做到這一點?

PS:這不是作業,但我理解這看起來很像。

如果你想變得貪婪和近似,你可以在數據上運行一個固定大小的 window,一次,並且只對 window 中的數字 - window 左端的那個與 window 中的任何其他數字 - 標記一個不在左端,所以你不重復使用它,並推進window,所以在左端的不重復使用。 從僅局部最優的意義上講,這是貪婪的。 如果您知道該列表是均勻隨機的,它可能很接近,並且是線性的,因為相對於 N,對恆定長度 k 的列表進行排序是恆定時間。有了關於列表分布的其他知識,您可以使用一個變體,即仍然是 O(N) 並且只是近似值。

不,不可能有線性時間算法來為您完成這項工作。 輸入的數字可以按任何順序排列,因此您無法使用 min Maxi[Si] 立即完成配對。 您當前的解決方案既簡單又好。

改進運行時間的建議:

您可以根據輸入數字創建二叉樹(這需要 O(nlog(n)) 時間)。 對樹進行順序遍歷並從 (first+i, last-i) 個元素(i 從 0 到 n/2)創建對

暫無
暫無

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

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