如何对amxn矩阵的所有m行进行排序并对n列进行排序?

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

我知道在O(mn 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]]

我认为你可以做得比Ω(mn log(min(m,n))快,至少在一般情况下不会。

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

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

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

订单关系还有待解决

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

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

=2Ω(平方米log m)+(n - m + 1)Ω(m log m)

=Ω(mn log m)


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


通过创建二进制搜索树,我们可以在O(mn)时间内实现这一点。 从第一列(上述示例中的元素3)中取出最后一个元素,将其作为根。 右节点将成为最后一行的n个更大的元素,左节点将成为上面元素的一个,即。 第(m-1)行或第二行的第一个元素。 同样对于这个元素,右边的节点将是该行的n个元素。 再次m-2将是左边的元素,它的行中的所有n个元素将是正确的元素。 同样向前移动,我们将在O(mn)时间创建一个二叉搜索树。 这是O(mn),因为我们在插入时没有进行搜索,它是在移动根节点指针进行遍历时的简单插入。 然后按顺序遍历这个BST,这也将是O(mn)时间。

链接地址: http://www.djcxy.com/p/22735.html

上一篇: How to sort a m x n matrix which has all its m rows sorted and n columns sorted?

下一篇: free network in a lattice