鉴于:
N
的数组。找到一个算法:
K
个最小的数组元素。N
log N
),空间复杂度为O(log N
)。答案 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)
minimum
和maximum
元素。pivot
和minimum
之间找到一个随机元素maximum
(不包括在内)。pivot
(numSmallerEqual
)的元素数量以及大于pivot
(numBigger
)的元素数量。
numSmallerEqual
,请设置maximum
= pivot。minimum
= pivot。maximum
- minimum
)== 0,输出minimum
,则终止。maximum
- minimum
)== 1
numSmallerEqual
,请输出minimum
。maximum
。编辑:更正了lVlad指出的错误,仍然没有经过测试。
答案 3 :(得分:0)
您可以采用参数化方法:
由于我们在问题中指定了k
,我们可以将其视为常量,因此O(k
log N
)的空格应该是可接受的。
k
分区(O(1)时间和O(k
log N
)空间以存储分区边框,因为每个键只需要日志N
空间)N
)时间和O(k
log N
)空间以存储最小元素k
)时间)由于那里有更多周期的空间,因此可能有更好的方法。另请注意,这对排序的数组执行效果非常差......