Matrix 完全排序矩阵
这个问题是在我的一次工作面试中问我的-Matrix 完全排序矩阵,matrix,Matrix,这个问题是在我的一次工作面试中问我的- M是一个二维n×n矩阵,其中每一行和每一列都被排序,所有的矩阵元素都是不同的。我需要一个O(n)算法——给定指数I,j,i0,j0作为输入,计算M小于M[I,j]且大于M[i0,j0]的元素数。我为此尝试了各种方法,但都不明白。非常感谢您的帮助。下一部分是找出M in O(nlogn)预期时间的中位数。将矩阵视为一组行。每行中都有最小和最大有效值的索引。如果您知道这些索引,您可以在O(1)中计算该行中的有效值数。(我所说的有效值是指介于M[I,j]和M[i
M是一个二维n×n矩阵,其中每一行和每一列都被排序,所有的矩阵元素都是不同的。我需要一个O(n)算法——给定指数I,j,i0,j0作为输入,计算M小于M[I,j]且大于M[i0,j0]的元素数。我为此尝试了各种方法,但都不明白。非常感谢您的帮助。下一部分是找出M in O(nlogn)预期时间的中位数。将矩阵视为一组行。每行中都有最小和最大有效值的索引。如果您知道这些索引,您可以在O(1)中计算该行中的有效值数。(我所说的有效值是指介于M[I,j]和M[i0,j0]之间的值。) 现在,矩阵已排序。让我们看看下限:(i,j)
- 如果要在前一行中找到有效值最小的索引,它必须位于(i,j)的右侧。这是因为(i,j)正上方必须有无效(太小)值
- 如果要在下一行中找到有效值最小的索引,它必须位于(i,j)的左侧(或其正下方)
selection_find(M, i0,j0, i2,j2, K):
# Find K-th smallest number between M(i0,j0) and M(i2,j2)
# assumption: M(i0,j0)<M(i2,j2)
N := number of values between M(i0,j0) and M(i2,j2)
# assumption: k<N
Pick at random i1,j1 so that M(i0,j0)<M(i1,j1)<M(i2,j2)
L := number of values between M(i0,j0) and M(i1,j1)
if L==K:
The answer is M(i1,j1)
if L<K:
The answer is selection_find(M, i1,j1, i2,j2, K-L)
if L>K:
The answer is selection_find(M, i0,j0, i1,j1, K)
median_find(M):
The answer is selection_find(M, 1,1, n,n, n²/2)
selection\u find(M,i0,j0,i2,j2,K):
#求M(i0,j0)和M(i2,j2)之间的第K个最小数
#假设:M(i0,j0)如果L>K,请检查行是否:答案是selection\u find(M,i0,j0,i1,j1,K)
如果L>K:答案是selection\u find(M,i0,j0,i1,j1,L-K)
?一个用户对此的评价很低。@nhahdh:哦,谢谢你的留言,我会错过的。是的,我看到了米歇尔的答案,我认为他错了,尽管我现在有点头晕,我不确定。问题是,这种情况是当我们的随机拍摄走得太远时:我们知道(下限)<(中位数)<(我们的拍摄)<(上限)。因此,我们可以将寻找中位数的“间隔”减少到镜头下方的部分,并改变上界。但是K不需要调整,它只在相反的情况下需要调整,我们在调整下限。虽然,正如我所说,我现在不是最好的状态…