输入是实数x1,x2,...,x2n的序列。我们想将这些数字配对成n对。对于第i对,(i = 1,2,...,n),让Si表示该对中的数字之和。 (例如,如果将x(2i-1)和x2i配对作为第i对,则Si = x(2i-1)+ x2i)。我们想要对这些数字进行配对,以使Maxi [Si]最小化。设计一个贪心算法来解决这个问题 问题
这是个问题;我的解决方案是简单地对数字进行排序并配对前10个元素并添加一个/减去一个索引并重复。该算法尝试针对每对进行优化,以使其变得贪婪。我只是想知道是否会有这样的线性时间算法?
PS:这不是作业,但据我所知,这看起来非常像。
答案 0 :(得分:1)
如果你想要贪婪和近似,你可以在数据上运行一个固定大小的窗口,一次,并且只在窗口内配对数字 - 窗口左端的数字与窗口中的任何其他数字 - 标记不在左端的那个,所以你不要重复使用它,然后推进窗口,这样就不会重新使用左端的那个。从局部最优的角度来说,这是贪婪的。如果您知道列表是均匀随机的,它可能是接近的,并且它是线性的,因为对常量长度k的列表进行排序是相对于N的恒定时间。对于列表分布的其他知识,您可以使用变量仍为O(N)且仅为近似值。
答案 1 :(得分:1)
没有。没有一个线性的时间算法来完成这项工作。输入数字可以是任何顺序,因此您无法立即使用min Maxi [Si]完成配对。您当前的解决方案简单而且好。
改善运行时间的建议:
您可以使用输入数字创建二叉树(这需要O(nlog(n))时间)。按顺序遍历树并从(first + i,last-i)元素(i从0到n / 2)创建对