【问题标题】:How to sort a m x n matrix which has all its m rows sorted and n columns sorted?如何对所有 m 行和 n 列都排序的 m x n 矩阵进行排序?
【发布时间】:2010-11-25 17:21:35
【问题描述】:

给定一个 m 行 n 列的矩阵,每个矩阵都是排序的。如何高效地对整个矩阵进行排序?

我知道一个运行时间为 O(m n log(min(m,n)) 的解决方案。我正在寻找更好的解决方案。

我知道的方法基本上一次需要 2 行/列并应用合并操作。

这是一个例子:

[[1,4,7,10],

 [2,5,8,11],

 [3,6,9,12]]

是输入矩阵,它对每一行和每一列都进行了排序。

预期输出是:

[1,2,3,4,5,6,7,8,9,10,11,12]

另一个例子:

[[1, 2, 3, 3, 4, 5, 6, 6, 7, 7],

 [1, 2, 4, 6, 7, 7, 8, 8, 9,10],

 [3, 3, 4, 8, 8, 9,10,11,11,12],

 [3, 3, 5, 8, 8, 9,12,12,13,14]]

【问题讨论】:

  • 矩阵中单元格的最大值是否已知?内存复杂度是个问题吗?
  • 这个问题相当模糊 - 尝试给出一个小的 m x n 矩阵的前后示例。
  • 认为他只是想对矩阵中的值进行排序。 (即给定特定的值结构,对值进行排序的有效方法是什么)
  • @Paul [(1, 4, 8), (2, 9, 11), (3, 12, 14)]
  • 刚刚添加了一个主要问题的示例。

标签: algorithm data-structures


【解决方案1】:

我认为你不能比 Ω(mn log(min(m, n)) 更快地做到这一点,在至少在一般情况下不会。

假设(不失一般性)m n。然后你的矩阵看起来像这样:

每个圆圈是一个矩阵条目,每个箭头表示已知的顺序关系(箭头源处的条目小于箭头目的地处的条目)。

要对矩阵进行排序,我们必须解决所有未知的顺序关系,其中一些显示在此处的灰色框中:

对所有这些框进行排序需要:

2 Σk m Ω(k log k) + (n - m + 1) Ω(m log m)

= 2 Ω(m² log m) + (n - m + 1) Ω( m 记录 m)

= Ω(m n log m)

【讨论】:

  • +1 对于我见过的任何问题的最佳答案。在我看来也是正确的,但这显得微不足道。
  • 哇!感谢您的解释。看起来很好听。我不明白几件事: 1. 第二项 (n - m + 1) Ω(m log m) 是从哪里来的?而且,2. 我想知道 Σk
  • (n - m + 1) Ω(m log m)来自从下到上跨越矩阵的对角灰色框:每个这样的框包含 m 个元素,并且有 (n - m + 1) 其中。至于你的另一个问题,Ω 是一个 lower 界限,而不是一个上限。
  • 一张好的图表值一千字,可惜我不能给它一个好的 10 票来弥补它:)
  • @Gareth - 完美。我得到了第二个任期的角色。但是,你确定 Σk
【解决方案2】:

如果元素是一定范围k内的整数,其中K=o(mn),我们可以使用额外空间的count排序来实现O(mn),否则mnlog(min(m,n))是我们最好的可以。

【讨论】:

    【解决方案3】:

    通过创建二叉搜索树,我们可以在 O(mn) 时间内实现这一目标。 取第一列的最后一个元素(上面提到的示例中的元素 3),将其作为根。右节点将是最后一行的 n 个更大的元素,左节点将是上面的元素,即。倒数第二行的第 (m-1) 个或第一个元素。同样对于这个元素,右节点将是该行的 n 个元素。同样 m-2 将是左侧元素,并且它所在行中的所有 n 个元素将是右侧元素。同样,我们将在 O(mn) 时间内创建一个二叉搜索树。这是 O(mn),因为我们不是在插入时进行搜索,而是通过移动根节点指针进行遍历时的简单插入。 然后将完成这个 BST 的中序遍历,这也是 O(mn) 时间。

    【讨论】:

    • 您描述的过程保证左节点不会大于右节点不会小于它们的父节点。它确实 不一定 必须构建 BST - 考虑第二个示例(第二列的第一个元素小于 first 的最后一个 = root)或类似地 a₁₁=1, a₁₂=2, a₂₁=3, a₂₂=4 。
    猜你喜欢
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    相关资源
    最近更新 更多