2次元配列(be a [n] [m])の要素が水平方向および垂直方向に増加しているようです。したがって、与えられた質問に対して、最初に要素のインデックスを見つける必要があります。したがって、要素をより迅速に見つけることができれば、ソリューションを最適化できます。問題は、それを効率的な方法でどのように見つけるかです。1つのアプローチは、マトリックスの中央の要素を取得し、それを使用して特定の要素をチェックすることです。
与えられた要素が真ん中の要素よりも小さい場合、右下のすべての要素が真ん中よりも大きいため、解は行列a[0][0]からa[n/ 2] [m /2]にあります(与えられた要素が小さいため)中央の要素よりも)、検索スペースをa[n][m]から元のサイズの4分の1であるa[n/ 2] [m/2]に縮小しました。
与えられた要素が真ん中の要素より大きい場合、左上のすべての要素が真ん中よりも小さいため、解は行列a[0][0]からa[n/ 2] [m /2]にありません(与えられた要素は中央の要素よりも大きい)、したがって、検索スペースは、配列全体からa[0][0]を引いたものからa[n/ 2] [m / 2]になり、元のサイズの4分の3になります。
配列の合計からa[0][0]からa[n/ 2] [m / 2]を引いたものは、配列インデックスを使用した3つの再帰呼び出しがあることを意味します
--------->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 =(no_of_rows)*(no_of_columns)
_________________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 .