似乎二维数组中的元素(假设为a [n] [m])在水平和垂直方向上递增。因此,对于给定的问题,我们需要首先找到该元素的索引。如果我们能以更快的方式找到该元素,则可以优化解决方案。那么问题是如何以高效的方式找到它。
一种方法是取矩阵的中间元素并检查给定元素是否与其相同。
如果给定的元素小于中间元素,则我们的解决方案位于矩阵 a [0] [0] 到 a [n/2] [m/2] 中,因为右侧和下方的所有元素都大于中间元素(由于给定的元素小于中间元素),所以我们已将搜索空间从 a [n] [m] 减少到原始大小的四分之一。
如果给定的元素大于中间元素,则我们的解决方案不在矩阵 a [0] [0] 到 a [n/2] [m/2] 中,因为左侧和上方的所有元素都小于中间元素(由于给定的元素大于中间元素),所以我们的搜索空间是完整数组减去 a [0] [0] 到 a [n/2] [m/2],即原始大小的四分之三。 "完整数组减去 a [0] [0] 到 a [n/2] [m/2]" 意味着,将使用数组索引进行三个递归调用。
--------->a[0][m/2](start index) to a[n/2][m](end index)
--------->a[n/2][0](start index) to a[n][m/2](end index)
--------->a[n/2][m/2](start index) to a[n][m](end index)
现在根据我们的搜索空间递归调用相同的函数。
我们的函数的时间复杂度如下所示。
注意:在时间函数中,n代表元素的总数而不是行数。n =(总行数)*(总列数)
_________________T(n/4) if given element is less than middle of the array.
/
/
T(n)==========------------------- 1 if n=1 (if element found)
\
\_________________3T(n/4) if given element is greater than middle element of array
因此,输出时间函数将为
T(n)=3T(n/4) 或 T(n)=T(n/4)
In worst case T(n)=3T(n/4)
T(n)=3{3T(n/4)}
T(n)=3power(i)T(n/(4)poweri) equation------> (1)
但是 T(1)=1(猜测给定元素已在数组中找到)。
so n/(4power(i))=1
====> n=2power(2*i)
====> n=2power(2*i)
在两边以2为底数取对数:(log[n])/2=i
====> i=log(sqrt(n))
代入方程1,我们得到T(n)=3power(log[sqrt(n)])
因此,在使用索引找到元素后,我们可以找到它的邻居。
假设找到的元素在a[i][j],则输出:
{
a[i-1][j-1],
a[i-1][j],
a[i-1][j+1],
a[i][j-1],
a[i][j+1],
a[i+1][j-1],
a[i+1][j],
a[i+1][j+1]
}
提供的
0<i<n and 0<j<n .