在行中搜索明智地排序2D n x n矩阵

时间:2013-10-17 12:15:06

标签: algorithm sorting search

如何按行排序的2D n x n矩阵搜索元素。 可以通过对每行使用二进制搜索在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

请帮助。

2 个答案:

答案 0 :(得分:0)

在矩阵 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))

如果(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。应该更改程序以满足您的界面和环境,并且返回值只是为了显示发生的事情,应该更改以满足您的需求。

答案 1 :(得分:-1)

虽然是一个相当旧的帖子,但仍然。

从右上角或左下角开始(你可以选择的任何一方)。假设我们选择右上角。       将密钥与矩阵元素进行比较。

 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)。