C++中使用迭代器完成二分搜索

autobeg=text.begin(),end=text.end();automid=text.begin()+(end-beg)/2;while(mid!=end&&... auto beg = text.begin(), end = text.end();

auto mid = text.begin() + (end - beg) / 2;
while(mid != end && *mid != sought) { //这里为什么用mid!=end作为循环的条件
if(sought < *mid)

end = mid; //为什么这里不用end = mid -1这样搜索不是更快么?

else

beg = mid + 1;

mid = beg + (end - beg) / 2;

}
展开
 我来答
chmwh1992
2015-02-03 · TA获得超过1126个赞
知道小有建树答主
回答量:475
采纳率:100%
帮助的人:545万
展开全部
1)因为end是指向区间最后一个元素的后面(见下面2));若找不到给定值,beg将移动到区间最后一个元素的后面(即end),相当于常见的low>high(参考数据结构);
2)因为迭代器text.end()是指向最后一个元素的后面,而不是最后一个元素,比如共有n个元素,则指向n+1;
所以在搜索完毕后,还要用代码判断是否搜索成功:
if(mid!=end)查找成功;
else 查找失败;
百度网友fc027fc
2015-02-03 · TA获得超过1.1万个赞
知道大有可为答主
回答量:3160
采纳率:83%
帮助的人:834万
展开全部
//这里为什么用mid!=end作为循环的条件

mid == end 的时候,begin==end,只有一个元素了。
//为什么这里不用end = mid -1这样搜索不是更快么?

end = mid-1;是更快但是注意这里mid的计算方式是:

mid = beg + (end - beg) / 2;

而不是mid = beg + (end - beg+1) / 2;所以end=mid-1是错误的。
比如0 1 2 3 4 搜索1.
第一次
beg = 0 end=4
mid=2
1<2
如果end =mid,又beg =0
则mid=0+(2-0)/2 = 1是正确的。
而如果end=mid-1,又beg=0
mid=0+(1-0)/2 = 0是错误的,找不到1.
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
0974ne111e
2023-07-02
知道答主
回答量:1
采纳率:0%
帮助的人:248
展开全部

可以是end = mid -1。

区别在于:

当元素个数为奇数个的时候,比如0,1,2,3,4,查找1。

end = mid -1的算法比end = mid 多一次while循环判断。

分析end = mid -1的情况:

初始beg指向0,end指向4后面的位置,此时mid指向2;

第一次循环:1<*mid,end = mid-1(end指向1),计算mid(指向0)

第二次循环:1>*mid,beg = mid+1(beg指向1),计算mid(指向1)

退出循环,此时*mid == 1,能够查找到。

分析end = mid 的情况:

初始beg指向0,end指向4后面的位置,此时mid指向2;

第一次循环:1<*mid,end = mid(end指向2),计算mid(指向1)

退出循环,此时*mid == 1,查找成功。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
gcc2012
2015-02-03 · TA获得超过245个赞
知道小有建树答主
回答量:128
采纳率:0%
帮助的人:94.5万
展开全部
有一点你搞错了
如果一个序列是 1,2,3,4
那么begin()指向1,end()是指向4后面一个位置,而不是4
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式