【问题标题】:Binary search not working for n = 1, 2二进制搜索不适用于 n = 1, 2
【发布时间】:2016-03-04 07:03:53
【问题描述】:

这是我的二进制搜索代码,n = no of elements in array

// Binary Search
// BUG: not working for n = 2

#include <iostream>

int main() {

    const int n = 1;
    int newlist[n];

    std::cout << "Enter " << n;
    std::cout << " elements in increasing order:\n";

    for( int i = 0; i < n; ++i ) {
        std::cin >> newlist[i];
    }

    int pos = 0, num;
    std::cout << "Enter number:\n";
    std::cin >> num;
    std::cout << '\n';


    int imin = 0, imax = n-1;
    int imid = (n - 1)/2;

    for( int i = 0; i < n; ++i ) {

        imid = (imin + imax) / 2;

        if( newlist[imid] == num ) {
            pos = imid;
        }

        else if( newlist[imid] < num ) {
            imin = imid+1;
        }

        else {
            imax = imid-1;
        }
    }

    if( pos != 0 ) {
        std::cout << "Found at " << pos+1;
    }

    else {
        std::cout << "Not found!\n";
    }

    return 0;
}

它对n &gt; 2 有效,但无法为n &lt;= 2 提供正确的输出,即,即使对于找到的元素也提供Not found! 输出。

我认为一种方法是为n &lt;= 2 单独实现,但这会变得很麻烦!请帮忙。

【问题讨论】:

  • 欢迎来到 Stack Overflow!听起来您可能需要学习如何使用调试器来逐步执行代码。使用好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏差在哪里。如果您要进行任何编程,这是必不可少的工具。进一步阅读:How to debug small programs.
  • @PaulR 这是一个使用 clang++ 和 g++ 完美编译的程序。因此问题出在逻辑上,使用调试器无法发现!
  • 如果您在调试器中单步执行代码,那么您的逻辑错误将立即显而易见。
  • @samjoe,调试器在查找逻辑问题时非常有用。事实上,既然您需要一个可执行文件才能在调试器中运行,那么调试器将如何帮助解决编译失败的问题?答:不会。
  • 请指导我如何使用调试器?我的系统上已经有 gdb,但这让我很沮丧。

标签: c++ search binary-search


【解决方案1】:

将您的 pos 运算符设置为 -1 而不是 0。0 表示您的第一个索引,并且由于您输出未找到 pos == 0 条件的元素,因此您的代码失败了。您应该最初将 pos 设置为 -1 并检查自身是否存在未找到条件,如果在 pos = 0 处找到元素,则表示该元素存在于第一个索引处。

【讨论】:

    【解决方案2】:

    第一个 pos 等于 0 是正确的值。因此,在开头将pos设置为-1,并在检查是否找到时与-1(或更常见的&gt;= 0)进行比较。

    其次,应该更改的项目很少,因为现在还没有那么多二分搜索:

    1. 没有理由在循环之前初始化mid,它只是一个临时变量,作用域在循环块中。
    2. 退出搜索的条件是min &gt; max,您不需要任何额外的计数器,因为即使值不存在,它也会始终运行循环n 次。所以改成while (min &lt;= max) { ...
    3. 最后但同样重要的是,一旦找到该项目,立即通过break 语句退出循环。

    【讨论】:

      【解决方案3】:

      我不认为 for 循环是要在这里使用的控制结构,因为您希望在找到正确的项目或 imin 和 imax 不合理时完成。

      在给定的实现中,您甚至不会在找到项目时停止循环,只需确认找到的项目“n-(找到项目之前的迭代次数)”次。

      此外,由于 C++ 数组和向量是从 0 开始的,因此将 position == 0 作为“未找到”的标记是一个坏主意;您可以改用 http://en.cppreference.com/w/cpp/types/numeric_limits 或 n 中的项目(因为索引从 0 变为 n-1)。

      理论上,您可以使用指针算法使您的数组从 1 开始,我假设您没有;我不会推荐它。但是,您被截断的代码缺少列表的实际定义。

      【讨论】:

        猜你喜欢
        • 2013-12-19
        • 1970-01-01
        • 2020-06-06
        • 2013-03-15
        • 2020-08-17
        • 2014-09-19
        • 1970-01-01
        • 2014-05-29
        • 2017-09-23
        相关资源
        最近更新 更多