【发布时间】:2013-03-30 19:07:10
【问题描述】:
我正在为大学作业编写二进制搜索方法,虽然我觉得这是正确的做法,但我觉得运行时间比它应该的要长.. 有人看到这有什么错误吗? iterator 是一个自定义类,没有什么花哨的,可以满足您的期望。 vec 是一个迭代器向量,它指向一个更大的链接列表,其中包含我“真正”搜索的内容
iterator searchVec(const I& item)
{
int left = 0;
int right = (int)vec.size()-1;
int mid = (right+left)/2;
while(*vec.at(left) != *vec.at(right)){
mid = (right+left)/2;
if (mid == 0 || mid == vec.size()-1){
//nothign else to search, we didnt find anything
return *vec.end();
}
if (*vec.at(mid) == item){
return vec.at(mid);
}
else if (item > *vec.at(mid)){
left = mid;
}
else if (item < *vec.at(mid)){
right = mid;
}
}
return vec.at(mid);
}
【问题讨论】:
-
您不能取消引用
vec.end()。你也不应该,因为你想返回一个 iterator,而不是一个值。 -
好点,我修改为
return vec.at(vec.size()-1); -
显而易见,您确定您的向量已排序(并且该排序使用对取消引用值的比较),对吗?此外,您将永远找不到第一个或最后一个迭代器指向的项目,因为您在
if (*vec.at(mid) == item)之前测试了if (mid == 0 || mid == vec.size()-1)。你不需要第一次检查,你应该删除它。 -
那如果向量是空的呢?不,返回一个迭代器通常是一个好主意,您只需要正确处理所有细节。
-
vector.at() 不返回迭代器。你为什么要取消引用它?这是指向类型 I 的指针向量吗?
标签: c++ algorithm binary-search