贪心算法对最小化最大和的数字进行配对

Posted

技术标签:

【中文标题】贪心算法对最小化最大和的数字进行配对【英文标题】:Greedy algorithm to pair numbers that minimizes the maximum sum 【发布时间】:2012-04-04 01:20:17 【问题描述】:

输入是一个实数序列 x1, x2, ..., x2n。我们想将这些数字配对成 n 对。对于第 i 个对 (i = 1, 2, ..., n),令 Si 表示该对中的数字之和。 (例如,如果将 x(2i−1) 和 x2i 作为第 i 对配对,则 Si = x(2i−1) + x2i)。我们希望将这些数字配对,以使 Maxi[Si] 最小化。设计一个贪心算法来解决这个问题 问题。


这就是问题;我的解决方案是简单地对数字进行排序并配对倒数第一的元素和加一/减一索引并重复。该算法尝试对每一对进行优化,从而使其变得贪婪。我只是想知道是否有线性时间算法可以做到这一点?

PS:这不是作业,但我知道这看起来很像。

【问题讨论】:

答案刚刚被删除,但我发布了这个:这里有一个link,适用于任何对基于任意元素排序的比较下限感兴趣的人。 我不知道那里发生了什么 - 答案似乎与我的评论一起消失了!感谢您的链接,我知道基于比较的任意元素排序的下限为 nlgn。我想知道是否有一种线性方法可以将这两个数字配对,以使它们的总和最小。我认为你想说的是,没有排序就没有其他方法,排序的下限是 nlgn? 您的解决方案是正确的。对数字进行排序并迭代地配对第一个和最后一个。如果你愿意,我可以提供证据。 【参考方案1】:

没有。不可能有一个线性时间算法来为您完成这项工作。输入数字可以是任何顺序,因此您无法立即使用 min Maxi[Si] 完成配对。您当前的解决方案既简单又好用。

提高运行时间的建议:

您可以从输入数字中创建一个二叉树(这需要 O(nlog(n)) 时间)。对树进行顺序遍历并从 (first+i, last-i) 元素(i 从 0 到 n/2)创建对

【讨论】:

二叉树如何提高运行时间?为什么它与使用在 O(nlgn) 中运行的任何排序方法有什么不同? 如果你使用 O(nlgn) 的排序算法,那么它将与二叉树的顺序相同。【参考方案2】:

如果您想要贪婪和近似,您可以在数据上运行一个固定大小的窗口,一次,并且只在窗口内配对数字 - 窗口左端的数字与窗口中的任何其他数字 -标记不在左端的那个,所以你不要重复使用它,并推进窗口,所以不重复使用左端的那个。从仅局部最优的意义上说,这是贪婪的。如果您知道该列表是均匀随机的,则它可能是接近的,并且是线性的,因为对恒定长度 k 的列表进行排序是相对于 N 的恒定时间。借助有关列表分布的其他知识,您可以使用以下变体仍然是 O(N) 并且只是近似值。

【讨论】:

我不认为从问题所说的近似值可以。所以我猜对 N 进行排序是唯一的出路?

以上是关于贪心算法对最小化最大和的数字进行配对的主要内容,如果未能解决你的问题,请参考以下文章

贪心算法 动态规划

[M贪心] lc1877. 数组中最大数对和的最小值(贪心+双周赛53_2)

算法导论----贪心算法,删除k个数,使剩下的数字最小

2017.12.27 算法分析 贪心算法删除数字求最小值问题

删除K个数字后的最小值(贪心算法实现)

贪心算法:最大子序和