给定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)。我试图解决它,但没有得到解决方案。实际上有没有解决方案?
答案 0 :(得分:1)
修改第N + 1个元素以获得X值并消除范围检查。然后,一旦找到具有X值的元素(如果M 尽管这种方法消除了比较重复,但它仍然有一个“额外”的比较: 我只能看到一种方法来削减与这种方法的额外比较:是使用零整数值转换为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; // (n + 2)-th comparison in case if value hasn't been found
}
解决方案(虽然不完美)
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
}