arrays - 查找数组中第二小的元素

标签 arrays algorithm

我正在尝试仅使用 n + ceil(lg n) - 2 比较来查找 n 个元素数组中第二小的元素。 CLRS 中的提示说找到最小的元素。

这需要进行 n - 1 次比较,所以我只剩下 ceil(lg n) - 1 比较来找到第二小的,一旦我知道最大的。

有什么想法吗?

谢谢,

克莱曼

最佳答案

假设我们有一个列表 a1...an,其中 n 是 2 的幂。

首先将元素配对,假设 a1 和 a2,a34等等,并将它们相互比较。这为您提供了 n/2 比较。

将所有获胜者推进到下一轮,现在只有n/2个元素,并重复相同的过程。这需要 n/4 次比较。

重复上述操作,直到只剩下 1 个元素,即最终获胜者。要到达那里,您必须进行 n/2 + n/4 + ... + 1 = n-1 比较。

这很好,但第二小的是哪一个?好吧,它必须是您的获胜者在通往顶峰的过程中击败的要素之一。有 lg n 个这样的失败者,因此您需要将它们相互比较以找到最小的(需要进一步的 lg n - 1 比较)。

最小的输家是整体第二小的输家。


很容易证明为什么上面的方法总是找到第二小的:因为它比每个元素都小,但最终的赢家,除了与冠军的那一轮之外,它会赢得每一轮。

如果 n 不是 2 的幂,则过程几乎完全相同,除了失败者列表的长度与下一个 2 的幂次方一样长,即为什么你最终得到 ceil(lg n)

关于arrays - 查找数组中第二小的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31999317/

相关文章:

c++ - 通过动态规划平衡排序括号

algorithm - 最短路径 : DFS, BFS 或两者?

arrays - 数组中的精确匹配 (MongoDB)

c++ - 如何在数组中定义 C++ 中的字符大小?

algorithm - 具有 4 个已知邻居的细化/骨架化算法

c++ - 具有两个嵌套循环的非递归合并排序 - 如何?

algorithm - 无意义 “Nearest Neighbor” 的数据集?

java - 数组输出出现问题并提示用户输入输出

java - Android提取对象数组的属性数组

java - 制作数组列表的副本而不循环