【发布时间】:2010-09-20 02:08:11
【问题描述】:
我相信有一种方法可以在 O(n) 中找到长度为 n 的未排序数组中的第 k 个最大元素。或者也许它是“预期的” O(n) 或其他东西。我们该怎么做?
【问题讨论】:
-
顺便说一下,当 k==n 时,这里描述的几乎所有算法都会变成 O(n^2) 或 O(n log n)。也就是说,对于所有 k 值,我不认为其中一个是 O(n)。我因为指出这一点而被修改了,但我认为无论如何你都应该知道。
-
对于任何固定的 k 值,选择算法都可以是 O(n)。也就是说,您可以有一个 k=25 的选择算法,对于任何 n 值都是 O(n),并且您可以对与 n 无关的任何特定 k 值执行此操作。算法不再是 O(n) 的情况是当 k 的值对 n 的值有一定的依赖关系时,例如 k=n 或 k=n/2。然而,这并不意味着如果您碰巧在 25 个项目的列表上运行 k=25 算法,它突然不再是 O(n),因为 O 表示法描述了算法的属性,而不是特定的运行它。
-
我在一次亚马逊采访中被问到这个问题,作为寻找第二大元素的一般案例。顺便问一下面试官主持面试的时候我没有问我是否可以破坏原始数组(即排序它),所以我想出了一个复杂的解决方案。
-
这是 Jon Bentley 的 Programming Pearls 第 11 列(排序)中的问题 9。
-
@KirkStrauser :如果 k==n 或 k==n-1 那么它就变得微不足道了。我们可以在单次遍历中获得最大值或第二个最大值。所以这里提供的算法实际上将用于不属于 {1,2, n-1, n} 的 k 值
标签: performance algorithm big-o