我用STL写了一个bin_search,但这些是一个小BUG

时间:2015-10-27 06:30:19

标签: c++

这些在函数generate和getData中没有问题 调试bin_search()时程序失败

在函数bin_search中似乎是这样, 使用向量

的无效迭代器

在VS2015中调试,在bin_search()

之后找出main()函数

pos的价值仍然未知。

我不知道如何计算

#include<iostream>

#include <cstdio>

#include <fstream>

#include <ctime>

#include <cstdlib>

#include <vector>
using namespace std;
using RANK = vector<int>::iterator;
const int RANGE = 1000;
const int SIZE = 50;
void generate(ofstream& of) {
    srand(static_cast<unsigned> (time(nullptr)));
    for (int i = 0; i < SIZE; ++i)
        of << static_cast<int> (rand() % RANGE) << endl;
}
void getData(ifstream& ifs, vector<int> &v) {
    int tmp;
    while(ifs >> tmp)
        v.push_back(tmp);
}
RANK bin_search(vector<int> &v, int key, RANK low, RANK high) {
    RANK e = v.end();
    // if (*mid == key)
    //     return mid;
    // else if (*mid < key)`
    //     bin_search(v, key, low, mid);
    // else if (*mid > high)
    //     bin_search(v, key, ++mid, high);
    // return nullptr;
    while (low < high) {
        RANK mid = v.begin() + v.size() / 2;
        if (*mid == key)
            return mid;
        else if (*mid < key) 
            low = mid;
        else if (*mid > key)
            high = ++mid;
    }
    return e;
} 
int main(int argc, char const *argv[]) {
    ofstream ofs("data", ios::out);
    generate(ofs);
    vector<int> arr;
    ifstream ifs("data", ios::in);
    getData(ifs, arr);
    int value;
    cout << "pls enter num to find: " << endl;
    cin >> value;
    RANK pos = bin_search(arr, value, arr.begin(), arr.end());
    cout << *pos << endl;
    // if (pos == arr.end())
    //     cout << "data " << value << "not find." << endl;
    // else {
    //     cout << "data at " << distance(arr.begin(), pos) << endl;
    // }
    getchar();
    return 0;
}

1 个答案:

答案 0 :(得分:1)

在应用二进制搜索之前,您如何知道数组已排序?在进行二分查找之前,必须对所有数组进行排序。

void generate(ofstream& of) {
  srand(static_cast<unsigned> (time(nullptr)));
  for (int i = 0; i < SIZE; ++i)
    of << static_cast<int> (rand() % RANGE) << endl;
}

在此函数中,您将生成一系列随机数,然后尝试将二进制搜索应用于该数组。二进制搜索的工作原理是对已排序的数字数组进行对数系列比较,以找到数组中的项目,或者说无法找到该项目(或者如果可以找到它将存在于哪些数字之间)。

如果数组未排序,因为它似乎是在这种情况下,因为数组中的数字是由srand生成的,即使生成随机数也没那么糟糕,二进制搜索的不变量永远不会被满足我们能做的最好的事情是在数组中线性搜索。