【问题标题】:How can I find Kth element in a m*n matrix that each rows(m) are in order with O(m(log m +log n)) [closed]如何在 m*n 矩阵中找到每行(m)按 O(m(log m +log n))排列的第 K 个元素 [关闭]
【发布时间】:2019-12-05 15:25:07
【问题描述】:

假设我们有一个 m*n 矩阵,其中每一行都是有序的。所以,我只知道这个问题的最佳算法顺序是 O(m(log m + log n))。 (这是一个测试问题,结果是这个顺序) 但我不知道这个算法是如何工作的

【问题讨论】:

  • 你还没有说问题出在哪里。我也不清楚“行是有序的”是什么意思。
  • 每一行都被排序(不是列)。我们想在这个矩阵中找到第 K 个元素
  • 您确定可以在O(m(log m + log n)) 中完成吗?绝对可以在O((m+n)log m)完成。
  • 我确信这是可能的,我认为这个问题是从一篇文章中提取的
  • @SomeDude,请问O((m+n)log m) 的解决方案是什么?

标签: algorithm matrix data-structures


【解决方案1】:

一个想法可以是这样的。

如果我问你给定数字x 在原始矩阵中的排名是多少?你如何回答这个问题? 一个答案可以是:

只需对每行第一次出现x 或更大的元素进行二分搜索。然后添加各个等级。

int rank = 1;
for (int i = 0; i < m; ++i) {
    rank += std::lower_bound(matrix[i].begin(), matrix[i].end(), x);
}

这可以在 O(m * log n) 时间内完成(在 n 大小的数组上进行 m 次二进制搜索)。
现在我们只需要对 x(在 0 和 INT_MAX 或matrix[0][k] 之间)进行二分搜索即可找到第 k 个等级。由于 INT_MAX 是 const,理论上这将使整体时间复杂度 O(m * log n)。一种优化,可以使用智能范围代替matrix[i].begin(), matrix[i].end()。

PS:还在想O(m*(log m + log n)) 或O( m * (log mn)) 的解决方案。

【讨论】:

  • 不确定你为什么要计算排名?没有给定的元素,您需要根据 OP 从矩阵中的所有元素中计算第 k 个最小元素。没有?
  • @SomeDude 完全正确
  • @v78 你的解决方案不正确
  • @SomeDude,我在上面创建了一个子问题(x 的等级),x 是其中的一个参数,并用它来解决你的问题(通过对x 进行二进制搜索),
猜你喜欢
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
  • 2012-04-16
相关资源
最近更新 更多