Algorithm 比较在按列和按行排序的矩阵中查找第k个最小元素的两种不同方法[M][N]

Algorithm 比较在按列和按行排序的矩阵中查找第k个最小元素的两种不同方法[M][N],algorithm,sorting,data-structures,time-complexity,Algorithm,Sorting,Data Structures,Time Complexity,第一种方法是:- 在对所有行进行排序时,我们可以使用使用最小堆将M个数组合并为一个数组的概念。过程如下:- 将每行的第一个元素包括到堆中,删除最小元素,并包括从中删除最小元素的行中的下一个元素(第一个最小元素将是矩阵[0][0]obv)。 做k次,复杂性为O(klogM) 第二种方式:- 在第一种方式中,我没有使用列也被排序的事实。 这里的想法是,当从堆中移除最小元素时,将右侧和底部元素插入堆中(除非它已经在堆中) 假设我们的矩阵是:- 5789 691013 711215 8131617 我知

第一种方法是:- 在对所有行进行排序时,我们可以使用使用最小堆将M个数组合并为一个数组的概念。过程如下:- 将每行的第一个元素包括到堆中,删除最小元素,并包括从中删除最小元素的行中的下一个元素(第一个最小元素将是矩阵[0][0]obv)。 做k次,复杂性为O(klogM)

第二种方式:- 在第一种方式中,我没有使用列也被排序的事实。 这里的想法是,当从堆中移除最小元素时,将右侧和底部元素插入堆中(除非它已经在堆中) 假设我们的矩阵是:-
5789
691013
711215
8131617
我知道最小元素是矩阵[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个元素并添加atmost 2,因此在从堆中删除k个元素后,我们将得到k个最小元素。
这里的复杂性是O(klogk),因为最多logk是堆的高度,我们在堆上做了k次操作,如果我错了,请纠正我

第二个想法在第一眼看到时看起来更好。但对于k大于M的情况
klogk大于klogM。

那么,对于k小于M的情况,第二种方法更好,而对于k大于M的情况,第一种方法更好吗?? 现在,因为k在每一步都会增加,高度也会随着k通过另一个2的幂而增加。
所以我的问题是,第二种方法的复杂性是否真的是O(klogk)?或者通过一些仔细的分析,它是更小的?>M时,也有可能在优先级队列中获得k个元素。然而,一个简单的调整将复杂性降低到O(k log min(k,M,N))。除非上面和左边的元素不存在或已经从队列中删除,否则不要插入元素。那么队列中元素的位置是不可比较的,这意味着它们最多有min(k,M,N)。

实际上,它说可以用O(k)完成。@mbeckish Yep,我很清楚这篇文章。我回答这个问题:“所以我的问题是,第二种方法的复杂性是否真的是O(klogk)?或者通过一些仔细的分析,它是较小的?”