使用向量的二分搜索

Posted

技术标签:

【中文标题】使用向量的二分搜索【英文标题】:Binary Search using a vector 【发布时间】:2020-03-13 20:41:11 【问题描述】:

所以.. 我已经了解了二进制搜索及其工作原理,甚至尝试使用常量数组而不需要用户的任何输入,但现在我尝试应用向量而不是数组来让用户输入两者的值从 vector 中搜索数字的列表和要搜索的目标。这里我在使用数组时使用了普通的分治法

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;这部分,也许是关于如何使用向量的大小?有人可以启发我吗

【问题讨论】:

您是否考虑过您的阵列版本总是损坏,并且使用vector 检测到损坏?其次,为什么不将数据硬编码到向量中并进行测试,就像在数组版本中一样? 请注意,二分查找仅适用于已排序的数据集。如果用户输入未排序的数据,那么您需要先对向量进行排序,然后才能对其进行二进制搜索。 好点,谢谢! NathanOliver 我不明白你所说的总是坏是什么意思,你能解释一下@PaulMcKenzie 有时使用数组会隐藏一个个或其他细微的错误。使用向量时,程序的行为可能会有所不同,此时隐藏的错误就会暴露出来。 【参考方案1】:

嗯,其他答案有助于解决问题,但如果您不知道,C++ 中有用于执行 二分搜索 的内置函数,您可以使用它们.

我将列出函数相关的二分查找:

sort:你只能对一个排序的数据使用二分查找,所以在搜索之前你必须保证数据是排序好的。 lower_bound:这个函数返回一个迭代器到第一个大于或等于值的元素。 upper_bound:这个函数返回一个迭代器到第一个大于值的元素。 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";
    


【讨论】:

也谢谢!但这肯定包括一个预定义的算法,不是吗? 对不起,我没有清楚地理解你的问题。 在开始时包含预定义算法,如果您的意思是应该在开始时定义算法并实施,那么答案是NO。这些是内置功能,您可以立即使用。【参考方案2】:

此行后需要return mean

cout << "The number you're looking for is found! \n";

就像你在数组版本中所做的那样。

此外,如 cmets 中所述,这仅在用户输入排序数据时才有效。

【讨论】:

【参考方案3】:

问题:

    没有回报。添加
cout << "The number you're looking for is found! \n";
return mean;
    速度太快,可能会跳过一些数字
else if(x[mean] > target)

    maximum = mean;

else

    minimum = mean;

为什么过快可能是个问题? 什么时候试试

vector<int>x1,2,3,4,5,6;
int target = 4;

【讨论】:

以上是关于使用向量的二分搜索的主要内容,如果未能解决你的问题,请参考以下文章

使用向量c ++进行二分搜索

如何使用二分搜索将元素插入已排序的向量中

涉及向量的二分搜索问题 (C++)

如果我们有对向量,如何进行下界二分搜索

用于二分搜索的错误简单函数 (C++)

二分搜索算法