概率选择算法

时间:2011-02-19 01:42:17

标签: algorithm

鉴于:

  • 长度为N的数组。
  • 数组包含整数。
  • 整数不一定要排序。

找到一个算法:

  • 返回{近似的} K个最小的数组元素。
  • 运行时复杂度为O(N log N),空间复杂度为O(log N)。
  • 算法不一定是确定性的。在概率算法的情况下,还提供了近似结果质量的度量。

4 个答案:

答案 0 :(得分:2)

将问题视为类似于Quicksort的问题。给定数组中的元素,您可以在O(n)时间和O(lg n)空间中获得其等级。您可以使用二进制搜索在O(lg n)次迭代中找到具有给定等级的元素,总共O(lg n)空间和O(n lg n)时间。

答案 1 :(得分:2)

不要构建分区。描述分区是什么(在恒定空间中),并以此递归选择。

quickselect recurses into的每个子数组都可以通过其边界来描述(最小和最大元素值,而不是它们的索引)。迭代所描述的子阵列需要O( n )比较,这些比较在每个递归级别进行,直到与快速排序相同的深度:O(log n )in平均情况。

Quicksort还在每个递归级别进行O( n )比较,而普通的置换式quickselect在平均情况下总共进行O( n )比较(因为它总是只递归到一个分区。)

这里有一个sample implementation用于不同的元素,并带有一个普通的quickselect实现进行比较。

答案 2 :(得分:2)

  1. 迭代数组一次,找到minimummaximum元素。
  2. 遍历数组,在pivotminimum之间找到一个随机元素maximum(不包括在内)。
  3. 遍历数组并计算小于或等于pivotnumSmallerEqual)的元素数量以及大于pivotnumBigger)的元素数量。
    1. 如果K <= numSmallerEqual,请设置maximum = pivot。
    2. 其他设置minimum = pivot。
  4. 如果(maximum - minimum)== 0,输出minimum,则终止。
  5. 如果(maximum - minimum)== 1
    1. 如果K <= numSmallerEqual,请输出minimum
    2. 其他输出maximum
    3. 终止。
  6. GOTO 2:
  7. 编辑:更正了lVlad指出的错误,仍然没有经过测试。

答案 3 :(得分:0)

您可以采用参数化方法:

由于我们在问题中指定了k,我们可以将其视为常量,因此O(k log N)的空格应该是可接受的。

  1. 将数组划分为等长的k分区(O(1)时间和O(k log N)空间以存储分区边框,因为每个键只需要日志N空间)
  2. 查找每个分区中的最小元素(O(N)时间和O(k log N)空间以存储最小元素
  3. 返回您拥有的k个元素的最大值(O(k)时间)
  4. 由于那里有更多周期的空间,因此可能有更好的方法。另请注意,这对排序的数组执行效果非常差......