4

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


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

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

4

2 回答 2

1

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

于 2012-04-04T01:51:37.597 回答
1

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

改善运行时间的建议:

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

于 2012-04-04T03:45:00.510 回答