在有限的比较中查找数组中的元素?

时间:2015-02-20 04:22:18

标签: c++ arrays algorithm

给定X,M,N,其中X =要在数组中搜索的元素,N =只访问数组中的前N个元素,M =数组大小,我们如何在数组中找到最大的元素(N + 1)比较?

例如, A = [3,5,2,9,8,4,1,6,7],此处M = 9 设N = 6,X = 5 =>因此,对于这种情况,只访问数组的前6个元素并尝试查找是否存在X?这里的答案将返回true。但是对于X = 6,答案将是错误的。

这个问题与时间复杂性无关。这是关于你做的比较的数量。例如,Brute force方法看起来像这样。

    void search(vector<int> A){
               for(int i=0; i<N; i++){ // [i < N is also comparison which is N times]
                     if(A[i] != X) continue;              // [N comparisons ]
                     else return true;
               }
               return false;
     }

时间复杂度为O(n),但比较次数为2 * N.将此比较减少到(N + 1)。我试图解决它,但没有得到解决方案。实际上有没有解决方案?

1 个答案:

答案 0 :(得分:1)

修改第N + 1个元素以获得X值并消除范围检查。然后,一旦找到具有X值的元素(如果M

分析

尽管这种方法消除了比较重复,但它仍然有一个“额外”的比较:

bool search(int* a, int n, int x)
{
  a[n] = x;
  int idx = 0;
  while (a[idx] != x) // n + 1 comparisons in case if value hasn't been found
    ++idx;
  return idx < n; // (n + 2)-th comparison in case if value hasn't been found
}

解决方案(虽然不完美)

我只能看到一种方法来削减与这种方法的额外比较:是使用零整数值转换为false并且任何不等于零的整数值转换为true的事实。使用此代码将如下所示:

bool search(int* a, int n, int x)
{
  a[n] = x;
  int idx = 0;
  while (a[idx] != x) // n + 1 comparisons in case if value hasn't been found
    ++idx;
  return idx - n; // returns 0 only when idx == n, which means that value is not found
}