gpt4 book ai didi

具有三个参数的 C++ 递归二进制搜索

转载 作者:太空狗 更新时间:2023-10-29 20:05:30 27 4
gpt4 key购买 nike

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

到目前为止,这是我的代码:

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;
}

最佳答案

当您尝试在 vector 的上半部分进行搜索时,这将不起作用,因为您真正需要创建的是 vector 的一部分。

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

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

作为替代,您也可以传递 vector (通过常量引用)和您希望搜索的范围。

您的最后一行无法访问。相反,它应该是您进行任何评估之前递归的终止条件。 (如果你的范围是空的)

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

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 表示“最后一个元素之后的一个”,因此如果 vector 的大小为 5,则第一次迭代将传递 0 和 5。如果 vector 为空,则传递 0 和 0。

作为练习,“可以用 3 个参数完成吗”?

是的...

 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);
}
}

关于具有三个参数的 C++ 递归二进制搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13048381/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com