【发布时间】:2018-04-13 12:18:42
【问题描述】:
我有一个关于实现二进制搜索的算法测试,该测试最多可在 2 秒内工作。
首先,我实现了一个递归版本的二分搜索,但在某些测试用例中它需要将近 3.6 秒才能完成。然后,我将其更改为迭代版本,但在同一个测试用例中需要 2.6 秒。但是,我认为使用while loop 是需要花费大量时间的一个原因。
我的问题是:我需要改进什么才能使其最多花费 2 秒?
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int iterBinarySearch(vector<int> A, int low, int high, int key) {
int mid;
while (low <= high) {
mid = low + ((high - low)/2);
if (key < A[mid]) {
high = mid -1;
} else if (key > A[mid]) {
low = mid +1;
} else {
return mid;
}
}
return -1;
}
int main() {
vector<int>dict;
vector<int>keys;
int dictSize;
cin >> dictSize;
while (dictSize--) {
int val;
cin >> val;
dict.push_back(val);
}
int keysSize;
cin >> keysSize;
while (keysSize--) {
int val;
cin >> val;
keys.push_back(val);
}
sort(dict.begin(), dict.end());
int size = (int)dict.size() -1;
for(int i = 0; i< keys.size(); ++i) {
if ((dict[0] > keys[i]) || (dict[size] < keys[i])) {
cout << "-1" << ' ';
} else {
int res = iterBinarySearch(dict, 0, size, keys[i]);
cout << res << ' ';
}
}
return 0;
}
【问题讨论】:
-
尝试两件事:开启优化,不要按值取值
vector(取值const&) -
阅读
dictSize和keysSize后,请立即致电vector::reserve()。 -
你为什么不用binary_search?
-
@MEnnabah - 不,他说得很清楚
const & -
@MEnnabah - 不,您需要修改函数参数。
vector<int> const &A。它将绑定到dict就好了(无需更改任何其他内容)。在const-ness 的假设下,优化编译器可以创造奇迹。
标签: c++ algorithm c++11 binary-search