c++ - 使用向量的二分搜索
问题描述
所以..我已经了解了二进制搜索及其工作原理,甚至尝试使用常量数组而不需要用户的任何输入,但现在我尝试应用向量而不是数组来让用户输入两个列表的值从向量中搜索数字和要搜索的目标。在这里,我在使用数组时使用了普通的分治法
using namespace std;
int Binary_search(int x[],int size,int target){
int maximum= size-1;
int minimum = 0;
int mean;
while (maximum>minimum){
mean = (maximum+minimum)/2;
if (x[mean] == target){
cout << "The number you're looking for is found! \n";
return mean;
}
else if(x[mean] > target){
maximum = (mean-1);
}
else{
minimum = (mean+1);
}
}
return -1;
}
int main(){
int x[]={1,2,3,4,5};
int a=sizeof(x)/sizeof(x[0]);
int target=4;
int show=Binary_search(x,a,target);
if (show != -1){
cout << "Your result is in the index: " << show;
}
return 0;
}
我的问题是我使用向量做了几乎相同的方法,但它显示了无限数量的 **Your result is found at the index: ** (number of wrong index) 。或者根本不显示任何结果,甚至显示未找到结果,每次都以某种方式不同。这是在使用矢量时
#include <iostream>
#include <vector>
using namespace std;
int Binary_search(vector<int>x,int target){
int maximum=(x.size())-1;
int minimum = 0;
int mean;
while (maximum>minimum){
mean = (maximum+minimum)/2;
if (x[mean] == target){
cout << "The number you're looking for is found! \n";
}
else if(x[mean] > target){
maximum = (mean-1);
}
else{
minimum = (mean+1);
}
}
return -1;
}
int main(){
unsigned int i;
int n;
vector<int>x;
cout << "Enter the amount of numbers you want to evaluate: ";
cin >> i;
cout << "Enter your numbers to be evaluated: " << endl;
while (x.size() < i && cin >> n){
x.push_back(n);
}
int target;
cout << "Enter the target you want to search for in the selected array \n";
cin >> target;
int show = Binary_search(x,target);
if (show == -1){
cout << "Your result is not found ! ";
}
else{
cout << "Your result is in the index: " << show;
}
return 0;
}
所以我认为问题出在这部分int maximum=(x.size())-1;
,也许是关于如何使用向量的大小?有人可以启发我吗
解决方案
好吧,其他答案已经帮助解决了这个问题,但是如果您不知道,可以使用内置函数来执行二进制搜索。C++
我将列出与二进制搜索相关的功能:
- sort:您只能对已排序的数据使用二进制搜索,因此在搜索之前必须保证数据已排序。
- lower_bound:此函数返回一个迭代器,指向大于或等于value的第一个元素。
- upper_bound:此函数返回一个迭代器,指向大于value的第一个元素。
- binary_search :: 此函数返回一个boolean,无论该值是否找到(与您的程序完全相同)。
这是一个演示先前功能的代码示例:
#include <iostream>
#include <vector>
#include <algorithm>
#include <iostream>
typedef std::vector<int>::iterator iter;
int main() {
std::vector<int> vec = {10, 20, 30, 30, 20, 10, 10, 20};
// sort the data
// the data will be:
// 10, 10, 10, 20, 20, 20, 30, 30
std::sort(vec.begin(), vec.end());
// index of the first element, greater than or equal to 20
iter low = std::lower_bound(vec.begin(), vec.end(), 20);
// index of the first element, greater than 20
iter high = std::upper_bound(vec.begin(), vec.end(), 20);
std::cout << "index of first element, greater than or equal to 20 is: " << (low - vec.begin()) << '\n';
std::cout << "index of first element, greater than to 20 is: " << (high - vec.begin()) << '\n';
// classic binary search
// check whether a givin value exists in the array or not
if (std::binary_search(vec.begin(), vec.end(), 99)) {
std::cout << "Found\n";
} else {
std::cout << "Not found\n";
}
}
推荐阅读
- react-native - 如何使用javascript将变量从本机反应传递到webview?
- android - 自定义浏览片段
- amazon-web-services - 存储在 AWS 中的应用程序日志是顺序格式还是并发格式?
- python - 对于具有形状 (2,2) 的 numpy 数组,为什么 imshow 命令沿 x 和 y 轴显示一系列值?这些价值观是什么?
- javascript - 返回多个 Sequelize 查询的结果
- python - 在 pandas 中执行模糊字符串匹配的更快方法
- reactjs - 使用 react-final-form 时选择焦点文本
- swift - 在scenekit中使用.obj从文档目录加载.mtl文件以获得纹理
- java - Java8::flatMap 可选
- r - 模拟以适应不同比例的逻辑