【问题标题】:Comparing two different ways of finding the kth smallest element in a column wise and row wise sorted matrix[M][N]比较在按列和按行排序的矩阵中查找第 k 个最小元素的两种不同方法[M][N]
【发布时间】:2013-07-08 04:30:20
【问题描述】:

第一方式:- 由于所有行都已排序,我们可以使用最小堆将 M 个数组合并为一个的概念。 过程是:- 将每行的第一个元素包含到堆中,删除最小元素并包含删除最小值的行中的下一个元素(第一个最小值将是 matrix[0][0] obv)。 做k次,复杂度为O(klogM)

第二种方式:- 在第一种方式中,我没有使用列也已排序的事实。 这里的想法是,当从堆中移除一个最小元素时,将右边和底部的元素插入到堆中(除非它已经在堆中) 假设我们的矩阵是:-
5 7 8 9
6 9 10 13
7 11 12 15
8 13 16 17
我知道最小元素是矩阵 [0] [0],所以对于 k=1,ans 将是 5 对于大于 1 的 k 值,这是我们想要的,因为 k=1 是微不足道的 在第一步,我可以包括 7(0,1) 和 6(1,0) (并使 matrix[0][1]=-1 和 matrix[1][0]=-1 以确保我们稍后知道堆中的哪个元素)进入堆,然后 6(1,0) 将成为第二个最小值。
将添加下一步 9(1,1) 和 7(2,0)。
现在 7(0,1) 将被删除并 8(0,2) 将被添加( 9(1,1) 已经在堆中,我在矩阵 -1 中输入了这个条目以明确它已经在堆中)。并且以这种方式在每一步中删除 1 个元素,最多添加 2 个元素,因此在从堆中删除 k 个这样的元素后,我们将获得我们的 k 个最小元素。
这里的复杂度是 O(klogk),因为最多 logk 是堆的高度,我们正在对堆进行 k 次操作,如果我错了,请纠正我。

第二个想法乍一看似乎更好。但是对于k大于M的情况
klogk 大于 klogM。

那么是不是 k 小于 M 第二种方法更好,而 k 大于 M 第一种方法更好? 现在因为 k 在每一步都在增加,并且高度也在随着 k 越过另一个 2 的幂而增加。 所以我的问题是第二种方法的复杂性是否真的 O(klogk)?或者通过一些仔细的分析,它是较小的?

【问题讨论】:

    标签: algorithm sorting data-structures time-complexity


    【解决方案1】:

    O(k log k) 确实是最好的界限——即使当 k >> M 时,也有可能在优先级队列中获得 k 个元素。然而,一个简单的调整可以将复杂度降低到 O(k log min(k , M, N))。不要插入元素,除非上面和左边的元素不存在或已经从队列中删除。那么队列中元素的位置是不可比的,也就是说最多有min(k, M, N)个。

    【讨论】:

    • 其实this post说可以在O(K)内完成。
    • @mbeckish 是的,我很清楚那篇论文。我在回答这个问题:“所以我的问题是,第二种方法的复杂性是否真的是 O(klogk)?或者通过一些仔细的分析,它是否更小?”
    猜你喜欢
    • 1970-01-01
    • 2021-04-21
    • 2013-02-17
    • 2021-12-31
    • 2012-05-18
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多