首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带三个参数的C++递归二进制搜索

带三个参数的C++递归二进制搜索
EN

Stack Overflow用户
提问于 2012-10-24 19:32:56
回答 3查看 2.3K关注 0票数 3

我99%确定我的问题是我每次开始都设置为零。但我不确定如何保持低,无论我的递归深度如何,始终代表低索引。如果它准确地告诉我低指数的指数,我认为我不会有问题。

到目前为止,我的代码如下:

代码语言:javascript
复制
int recBSearch(vector<int> v, int size, int item)
{
    int index = size / 2;
    int curr = v[index];
    int low = 0;
    int high = size -1;
    if (v[index] == item)
        return index;
    else if (v[index] > item)
    {
        high = index;
        index = (high+low)/2;
        size = high - low;
        return recBSearch(v, size, item);
    }
    else if (v[index] < item)
    {
        low = index;
        index = (high+low)/2;
        size = high - low;
        return recBSearch(v, size, item);
    }
    return -1;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-24 19:42:39

当您试图搜索向量的上半部分时,这将不起作用,因为您真正需要创建的是向量的一部分。

已经存在二进制搜索,但如果您决定编写自己的搜索,请在参数中使用迭代器范围。(您可以传入两个普通迭代器或一个boost范围)。

如果没有找到,则需要-1作为迭代器位置,因此在您的片(迭代器范围)中,需要指定一个起始索引号,以防找到它。

作为替代方法,您还可以传递向量(通过常量引用)和要搜索的范围。

您的最后一条线路无法接通。相反,在进行任何计算之前,它应该是递归的终止条件。(如果您的范围为空)

通过引用传递并使用索引号(最简单)进行迭代的版本将如下所示:

代码语言:javascript
复制
int recBSearch( std::vector<int> const& vec, int start, int end, int value )
{
    if( start == end )
    {
       return -1;
    }
    int index = (start + end) / 2;
    // continue from here
}

end表示“超过最后一个元素”,因此如果向量大小为5,则第一次迭代将传递0和5。如果向量为空,则传递0和0。

作为练习,“用3个参数就能做到吗?”

是的..。

代码语言:javascript
复制
 typedef std::vector<int>::const_iterator citer;
 int recBSearch( citer start, citer end, int value )
 {
    if( start == end )
    {
       return -1;
    }
    citer middle = start + (end-start)/2;
    if( *value == *middle )
    {
       return middle - start;
    }
    else if ( *value < *middle )
    {
       return recBSearch( start, middle, value );
    }
    else // note the change here
    {
        int res = recBSearch( middle+1, end, value );
        if( res == -1 )
           return -1;
        else
           return res + 1 + (middle-start);
    }
 }
票数 6
EN

Stack Overflow用户

发布于 2012-10-24 19:41:20

如果你想做递归,你的方法需要把搜索范围作为参数。否则,假设您总是向函数提供完整的向量,您就无法跟踪在粗糙的调用中在哪里进行搜索。

所以你的方法签名应该是这样的:

代码语言:javascript
复制
int recBSearch(vector<int> v, int first, int last, int item)
票数 2
EN

Stack Overflow用户

发布于 2012-10-24 19:41:11

二分查找的基本原理是将你的范围分成两半,然后在每一半中进行搜索。您的代码显示您对两个分支的下半部分进行操作。您需要在第二个else if中将v向量的较高半部分传递给递归调用,并使用size/2而不是size

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13048381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档