【问题标题】:Searching in a row wise sorted 2D n x n Matrix搜索按行排序的 2D n x n 矩阵
【发布时间】:2013-10-17 12:15:05
【问题描述】:

如何在按行排序的 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

请帮忙。

【问题讨论】:

  • 行已排序,但列未排序。所以 O(n) 是不可能的。
  • 那么,最好是 O(nlog(logn))?
  • 您的示例没有任何额外价值。另外,第二行没有排序。
  • 不一定总是会有一个额外的值,可以有 >=0 个元素的实例被找到。第二行已修复。
  • O(n) 当然是可能的。扫描数组中的每个元素是O(n) 操作的典型示例。相反的断言是基于n代表数组一维大小的误解;对于复杂性分析,它肯定不会,它代表数组中元素的数量。如果您对此表示怀疑,并认为扫描数组中的每个元素是O(n^2),那么只需将数组重新整形为一个向量(O(1),因为它只是在处理索引)并扫描向量......神奇地转动一个@987654330 @操作成O(n)一个。普肖。

标签: algorithm sorting search


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    虽然是一篇相当老的帖子,但仍然。

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

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

    【讨论】:

      猜你喜欢
      • 2021-09-16
      • 1970-01-01
      • 1970-01-01
      • 2017-08-05
      • 2012-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多