使用迭代器的二叉搜索
Binary search using iterator
问题在评论中。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> ivec = {15,17,19,25,45,78,98};
auto beg = ivec.begin() , end = ivec.end();
auto mid = beg + (end-beg)/2;
int sought;
cin>>sought;
while(mid != end && *mid !=sought) //why not "mid != beg"?
{
if(*mid>sought)
end = mid;
if(*mid<sought)
beg = mid + 1;
mid = beg + (end-beg)/2;
}
if(*mid == sought)
cout<<"Found";
else
cout<<"Not Found";
}
根据C++ Primer 5th Edition,在while结束时,mid将等于结束,或者它将表示我们正在查找的元素。如果 mid 等于 end,则该元素不在文本中。
我在用beg
替换end
后运行了该程序,它运行良好。
end
,过去结束迭代器,表示无效元素,因此无法取消引用。你必须首先确保mid
没有end
,这样你才能比较指向的值。
您的版本可能会调用未定义的行为,如果搜索的 elem 是第一个,则不会起作用。
为什么不是"mid != beg"?
因为它会在修复后破坏该程序,所以目前它已经损坏了。所以首先你必须让它正确,因为你的代码与你所说的相矛盾:
在 while 结束时,mid 将等于 end 或者它将表示我们正在查找的元素
所以最后一个条件必须是:
if(mid != end)
cout<<"Found";
else
cout<<"Not Found";
否则,当您在示例中输入sought
> 98 时,您将获得 UB。
现在,在修复程序后,如果在 while 循环条件下替换mid != end
以mid != beg
,您的算法将中断 - 例如,对于一个元素向量,它总是说"Found"。
相关文章:
- 使用std::multimap迭代器创建std::list
- 我可以在没有堆栈的情况下在二叉搜索树中实现迭代器吗?
- 基于函数而不是集合的二分搜索或迭代器?
- 编译时二叉搜索树错误的反向迭代器表示"no matching function call for operator=()"
- 使用二进制搜索树中的迭代器对象访问左侧节点
- 使用迭代器的二叉搜索
- 使用迭代器搜索映射中的值
- 按属性搜索对象的向量并返回迭代器
- 矢量迭代器在尝试对图形进行深度优先搜索时导致分割错误 11
- 二进制搜索树中按顺序遍历的复杂性(使用迭代器)
- 广度优先搜索中的 C++ 迭代器和指针用法
- 使用迭代器位置的线性和二叉搜索
- C++:二叉搜索树 end() 迭代器
- 从搜索算法返回的约定 - 索引或迭代器
- C++映射从迭代器位置开始搜索
- 如何使用节点在c++中为二进制搜索树编写迭代器
- 通过传递子迭代器进行二进制搜索
- c++初级二进制搜索迭代器
- 使用迭代器的二叉搜索,为什么我们使用"(end - begin)/2"?
- 如何简化检查搜索算法返回的迭代器是否有效