我最近遇到了一个面试问题。
我们有一个m*n
矩阵,使得每行都是非降序的(用不同的元素排序)。设计一个O(m (log m+ log n))
阶的算法来找到这个矩阵上的第k
个最小元素(只有一个元素是第k
个最小元素)。
我认为这是不可能的,所以在谷歌上搜索,找到this link和another solution和这个类似问题的答案。
我认为如下:
1.将所有行的中位数放入一个数组中,我们在O(m)
中找到这个数组的中位数,并将其称为pivot
1.我们在O(m log n)
中找到这个元素的秩。即:在每一行中有多少元素低于在步骤(1)中找到的枢轴。
1.通过比较k
和“主元的秩”,我们可以知道在每行中工作在右半部分或左半部分。(简化为m*n/2
矩阵。)
但该算法的时间复杂度为O(m * log^2 n)
。什么是可以在O(m (log n + log m))
上工作的算法?有什么办法吗?
2条答案
按热度按时间b09cbbtk1#
m行n列
O(m (log m+ log n))
的解决方案?O(k * log-m)
的解决方案,额外的空间为O(m)bbmckpt72#
A recent paper by Kaplan et al给出了这个问题的最佳算法,至少从大O的Angular 来看是这样。具体来说,通过使用软堆数据结构,他们给出了在时间上运行的算法
所有这些运行时都是最优的,因为假设我们只能使用基于比较的算法,没有一个运行时可以在大O意义上得到改进。
这里涉及的算法是平凡的,但比以前的算法满足类似的时间界限简单得多。软堆数据结构的使用是使一切正确和快速工作的关键。