你被给定一个行和列都按序排列的MxN二维数组。有什么高效的方法来搜索一个元素?
你被给定一个行和列都按序排列的MxN二维数组。有什么高效的方法来搜索一个元素?
v
开始。如果它是你要找的元素 x
,搜索完成。如果 v
比你要找的元素小,向下移动。如果 v
比你要找的元素大,向左移动。重复此过程直到到达矩阵的边缘。x
,则无需证明。考虑两种情况:v < x
x
。因此,我们可以忽略整个顶行并向下移动。 1 2 3 4 5 6
1 * * * * * v
2 * * * * * *
3 * * * * * *
4 * * * * * *
5 * * * * * *
to
1 2 3 4 5 6
1 . . . . . .
2 * * * * * v
3 * * * * * *
4 * * * * * *
5 * * * * * *
也就是说,我们最终得到了一个更小的问题。
另一种情况是
v > x
x
。因此,我们可以忽略整个右列并向左侧移动。 1 2 3 4 5 6
1 * * * * * v
2 * * * * * *
3 * * * * * *
4 * * * * * *
5 * * * * * *
为了
1 2 3 4 5 6
1 * * * * v .
2 * * * * * .
3 * * * * * .
4 * * * * * .
5 * * * * * .
再次,我们面临一个较小的问题。通过归纳法,我们完成了任务。这个算法的时间复杂度为O(m + n)
。
Ted Hopp链接到了这个想法的一个绝妙扩展,可以获得更好的性能。
这里是这个想法。在我上面给出的算法中,思路是我们可以一次性消除整行或整列的考虑。他所链接的思路是一次性消除整个象限。这个想法很简单。
* * * * * *
* * * * * *
* * * * * * <- binary search
* * * * * *
* * * * * *
对中间行进行二分查找。这将为您提供所需的项,或者是包含您要查找的项的位置。
* * * * * *
* * * * * *
* * * a|b * <- x between a, b
* * * * * *
* * * * * *
a
,右下角的所有元素都大于b
。. . . . * *
. . . . * *
. . . a|b .
* * * * . .
* * * * . .