Algorithm 比较在按列和按行排序的矩阵中查找第k个最小元素的两种不同方法[M][N]
第一种方法是:- 在对所有行进行排序时,我们可以使用使用最小堆将M个数组合并为一个数组的概念。过程如下:- 将每行的第一个元素包括到堆中,删除最小元素,并包括从中删除最小元素的行中的下一个元素(第一个最小元素将是矩阵[0][0]obv)。 做k次,复杂性为O(klogM) 第二种方式:- 在第一种方式中,我没有使用列也被排序的事实。 这里的想法是,当从堆中移除最小元素时,将右侧和底部元素插入堆中(除非它已经在堆中) 假设我们的矩阵是:-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 我知
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)?或者通过一些仔细的分析,它是更小的?