【发布时间】:2019-12-20 07:27:26
【问题描述】:
我目前正在研究不同的搜索算法,我做了一个小程序来看看效率上的差异。二分搜索应该比线性搜索快,但时间测量显示不同。我在代码中犯了一些错误还是这是一些特殊情况?
#include <chrono>
#include <unistd.h>
using namespace std;
const int n=1001;
int a[n];
void assign() {
for (int i=0; i<n; i++) {
a[i]=i;
}
}
void print() {
for (int i=0; i<n; i++) {
cout << a[i] << endl;
}
}
bool find1 (int x) {
for (int i=0; i<n; i++) {
if (x==a[i]){
return true;
}
} return false;
}
bool binsearch(int x) {
int l=0,m;
int r=n-1;
while (l<=r) {
m = ((l+r)/2);
if (a[m]==x) return true;
if (a[m]<x) l=m+1;
if (a[m]>x) r=m-1;
}
return false;
}
int main() {
assign();
//print();
auto start1 = chrono::steady_clock::now();
cout << binsearch(500) << endl;
auto end1 = chrono::steady_clock::now();
auto start2 = chrono::steady_clock::now();
cout << find1(500) << endl;
auto end2 = chrono::steady_clock::now();
cout << "binsearch: " << chrono::duration_cast<chrono::nanoseconds>(end1 - start1).count()
<< " ns " << endl;
cout << "linsearch: " << chrono::duration_cast<chrono::nanoseconds>(end2 - start2).count()
<< " ns " << endl;
return 0;
}
【问题讨论】:
-
TL;博士。由于内存局部性,在足够小的子集上,二分搜索可能比线性搜索慢。
-
试试 n=10 百万..
-
您是否记得在启用优化的情况下编译您的代码?
-
您忘记了所有这些复杂性声明的开头语句:“有一个
n_0,因此对于所有n > n_0...”。 -
请注意,
if (a[m]>x)是不必要的。你已经知道它不是平等的,也不是更少的。所以它必须更大。将该行更改为else r=m-1;
标签: c++ algorithm performance search binary-search