如何在按行排序的 2D nxn 矩阵中搜索元素。可以通过O(nlogn)
对每一行使用二进制搜索和对每一行O(nlog(logn))
使用插值搜索来完成。有什么O(n)
解决办法吗?
约束:数组包含整数。
示例:在给定的 5x5 矩阵中搜索 32。
0 5 6 8 42 98
-4 -1 3 21 455
-4 0 3 4 4
0 0 0 0 0
0 [32] 64 244 333
请帮忙。
在矩阵M [m*n](m 行,n 列)中搜索x 。
我认为最好的选择是不正确的跳行。
- 如果 x 超出行(r)的范围,则跳过其中的搜索
除此之外,只需应用二进制(或索引位近似)搜索
const int n=...;
const int m=...;
double x=...,A[m][n]={...};
int r,i,j,j0;
double *p;
// init bit mask for index approximation
for (j=1;j<n;j<<=1); j>>=1; if (!j) j=1; j0=j;
// search
for (r=0;r<m;r++) // all rows
if (x>=A[r][0]) // skip if x is too low
if (x<=A[r][n-1]) // skip if x is too high
{
// index approximation search in row r
for (p=A[r],i=0,j=j0;j;j>>=1)
{
i|=j;
if ((i>=n)||(x<p[i])) i^=j;
if (x==p[i]) return "x found in A[r][i]";
}
}
return "x not found";
在复杂度上,你的 N 是 m*n,算法是:
Omin(m+ log2(n))
Omax(m+m*log2(n))
if (m==n) 那么我们可以更简单地以 N=n*n 的顺序重写它:
Omin(sqrt(N)+ log2(sqrt(N)) )
Omax(sqrt(N)*(1+log2(sqrt(N))))
如果不是,则 n->N/m 和 m->N/n 所以:
Omin((N/n)+ log2(sqrt(N/m)) )
Omax((N/n)*(1+log2(sqrt(N/m))))
如您所见,复杂性很大程度上取决于矩阵值,并且从 Omin 到 Omax。应该更改程序以满足您的界面和环境,并且返回值只是为了显示发生了什么,应该更改以满足您的需求。
虽然是一个相当古老的帖子,但仍然如此。
从右上角或左下角(您可以选择的任何一侧)开始。假设我们选择右上角。将密钥与矩阵元素进行比较。
if(key==matrix[i][j])
return true;
if(key<matrix[i][j])
then move towards left(j--)
else //if the key is greater than the matrix element
then move towards down (i++);
最坏情况的时间复杂度是当我们需要遍历一整行和一整列时,因此 O(n+n) =O(n)。