用c ++中的向量进行二进制搜索

时间:2013-03-30 19:07:11

标签: c++ algorithm binary-search

我正在为大学作业写一个二进制搜索方法,虽然我觉得这是正确的做法,但我觉得运行时间比它应该更长..有没有人看到任何错误? 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);
}

1 个答案:

答案 0 :(得分:0)

一些想法:

  • 您正在使用std::vector::at slow compared to std::vector::operator[]
  • 您无法取消引用vec.end()。通常,如果您想要通知来电者没有找到任何项目,则会返回该通知。但是在这里,因为你没有返回vec的迭代器,也许你应该用布尔输出参数或异常来发出信号。
  • 循环条件对我来说不合适。它似乎应该是left <= right而不是*vec[left] != *vec[right]。然后循环的目的是选择项目。如果我们突破循环,则找不到任何项目。
  • 退出条件无用,会阻止查找第一个和最后一个元素,如评论中所述。

        if (mid == 0 || mid == vec.size()-1)
            //nothign else to search, we didnt find anything
            return *vec.end();
        }
    

这是一个略微更正的代码:

iterator searchVec(const I& item)
{
    int left = 0;
    int right = (int)vec.size()-1;
    int mid = (right+left)/2;

    while(left <= right) // corrected condition
    {
        mid = (right+left)/2;
        iterator it = vec[mid]; // avoid recomputing vec[mid]
        if (*it == item) // this can be moved in a else {} statement,
            return it;   // after the else if (no impact on performances I think)
        else if (item > *it)
            left = mid + 1; // you were not strictly decreasing the interval
        else if (item < *it)
            right = mid - 1; // same here
    }
    throw not_found();
}
相关问题