![](/img/trans.png)
[英]Why is this method's time complexity 2*O(n log n) + O(m log m)?
[英]Algorithm with O(m (log n + log m)) time complexity for finding kth smallest element in n*m matrix with each row sorted?
我最近遇到了一个面试问题。
我们有
m*n
矩阵,使得每一行都按非递减顺序(用不同的元素排序)。 设计一个O(m (log m+ log n))
阶的算法来找到这个矩阵上的第k
个最小元素(只有一个元素作为第k
个最小元素)。
我认为这是不可能的,所以在谷歌上搜索并找到这个链接和另一个解决方案以及这个类似问题的答案。
我认为如下:
将所有行的中值放入一个数组中,我们在O(m)
中找到该数组的中值,并将其命名为 pivot
我们在O(m log n)
中找到该元素的等级。 即:在每一行中有多少元素低于步骤(1)中找到的 pivot。
通过比较k
和“枢轴的等级”,我们可以知道每一行都在右半边或左半边工作。 (减少到m*n/2
矩阵。)
但是这个算法的时间复杂度是O(m * log^2 n)
。 可以在O(m (log n + log m))
上运行的算法是什么? 有什么想法吗?
m - 行 n - 列
您是否需要具有O(m (log m+ log n))
复杂度的解决方案?
我可以想出一个复杂度为O(k * log-m)
且额外空间为 O(m) 的解决方案
class PQObject { int value; // PQ sorting happens on this int.. int m; // And m and n are positions. int n; }
您可以将第一列中的所有值放入优先级队列并开始弹出直到第 k 个最小元素
最终问题归结为在 M 排序的 arrays 中找到第 k 个最小的元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.