第一方式: - 在对所有行进行排序时,我们可以使用使用最小堆将M阵列合并为一个的概念。过程如下: - 将每行的第一个元素包含到堆中,删除最小元素并包含删除最小值的行中的下一个元素(第一个min将是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
对于k大于1的值,这是我们想要的,因为k = 1是微不足道的
在第一步,我可以包括7(0,1)和6(1,0)(并使矩阵[0] [1] = - 1和矩阵[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)?或者通过一些仔细的分析,这是一个较小的东西?
答案 0 :(得分:0)
O(k log k)确实是最好的界限 - 即使k>>也可以在优先级队列中获得k个元素。然而,一个简单的调整将复杂性降低到O(k log min(k,M,N))。除非上面和左侧的元素不存在或已经从队列中删除,否则不要插入元素。然后队列中元素的位置是无法比拟的,这意味着它们最多只有min(k,M,N)。