繁体   English   中英

具有 O(m (log n + log m)) 时间复杂度的算法,用于在 n*m 矩阵中查找第 k 个最小元素,每行排序?

[英]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个最小元素)。

我认为这是不可能的,所以在谷歌上搜索并找到这个链接另一个解决方案以及这个类似问题的答案

我认为如下:

  1. 将所有行的中值放入一个数组中,我们在O(m)中找到该数组的中值,并将其命名为 pivot

  2. 我们在O(m log n)中找到该元素的等级。 即:在每一行中有多少元素低于步骤(1)中找到的 pivot。

  3. 通过比较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) 的解决方案

    • 对于这种复杂性,您可以使用修改后的 PriorityQueue(堆)DataStructure
     class PQObject { int value; // PQ sorting happens on this int.. int m; // And m and n are positions. int n; }
  • 您可以将第一列中的所有值放入优先级队列并开始弹出直到第 k 个最小元素

    • 每次弹出时,在弹出的 object 中使用 m 和 n 重新插入行的下一个值。
  • 最终问题归结为在 M 排序的 arrays 中找到第 k 个最小的元素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM