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)的左侧(或其正下方)

所以你需要在矩阵上走最多2n步才能找到每一行的下界索引。上限也是如此。所以您的行走是O(n),那么计算每行的有效值的数量是O(n),所以总时间是O(n)

使用此算法可以解决中值问题。首先要注意的是,如果您计算前一个问题的解决方案,您可以使用每行边界值的索引在线性时间内随机选取一个有效值。然后可通过二分法计算中值:

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不需要调整,它只在相反的情况下需要调整,我们在调整下限。虽然,正如我所说,我现在不是最好的状态…