【发布时间】:2013-10-25 07:11:35
【问题描述】:
我正在努力解决这个问题..
给定一个包含 n 个数字的列表,我们想找到最小的和第二小的 列表中的数字。描述一个分治算法来解决这个问题。假设整数 k 的 n = 2^k。使用您的算法的比较次数应该 不超过 3n/2 - 2,即使在最坏的情况下。
我目前的解决方案是使用选择算法得到中位数,然后将列表分为L1(包含小于或等于中位数的元素)、R(中位数)、L2(包含所有大于中位数的元素)。这是正确的吗?如果是这样,我下一步该怎么做?
【问题讨论】:
-
天真的方法效果很好:与 current_lowest 进行比较,(可能)与 current_2nd_lowest 进行比较。
-
@wildplasser 我同意这样的预期时间很好,但该声明特别要求最坏情况下的性能。最坏的情况可能是 [0,x,x,x,x,x,x,x,x] 之类的东西,您必须检查 0 之后的每个元素的最低和 second_lowest。它也不是分而治之。
-
@OP 您当前的解决方案是完全正确的。 :) 只需像这样继续划分列表并继续对具有较小元素的子列表进行操作。基本上对 L1 进行递归调用,直到 L1 最终成为仅包含 2 个元素的列表。请注意,它与使用快速选择算法 (k = 2) 结合中位数算法来选择枢轴非常相似。这种方法有很多信息,而且很容易实现。唯一困难的部分是理解子程序
partition是如何工作的。