繁体   English   中英

C++ 入门二进制搜索不起作用。 不明白为什么

[英]C++ Primer Binary Search not working. Can not understand why

void binary_search_vec(std::vector<int> a, int finder) {    

    auto full_beg = a.begin();
    auto beg = a.begin();
    auto end = a.end();
    auto mid = beg + (end - beg) / 2;


    while (*mid != finder && mid != end) {

        if (finder > *mid) {
          beg = mid + 1;

        }
        else {  //(*mid > finder) 


            end = mid;
        }
        mid = beg + (end - beg) / 2;

        if (finder == *mid) { // Here is the problem leading to undefined behavior. I am negating the condition in the While Loop. Credit to Bob___ for the fix. And thank you to the community.

         std::cout << "Num found: " << finder << " at position: " << std::distance(full_beg, mid) << 
         std::endl;
         break;
        
        }

    }
    
}

编辑:有问题的代码来自 C++ Primer 5th edition。 有问题的二进制搜索根本不返回找到的数量。 我不明白为什么。 与其他用户逐行比较。 他们的工作我的没有。

来自另一个用户的此代码有效。 我不明白第二次编辑的区别:@Bob___ 修复代码:

auto full_beg = a.begin();
auto beg = a.begin();
auto end = a.end();
auto mid = beg + (end - beg) / 2;


while (*mid != finder && mid != end) {

if (finder > * mid) {
      beg = mid + 1;

    }
    else {  //(*mid > finder) 


        end = mid;
    }
    mid = beg + (end - beg) / 2;

}
 if (finder == *mid) {
    std::cout << "Num found: " << finder << " at position Index: " << std::distance(full_beg, mid) << std::endl;

}
else std::cout << "Not Found!" << std::endl;

}

将最后一个if分支移出 while 循环并删除break语句,否则如果findermid相同,它将不起作用。

以下代码有效:

#include <iostream>
#include <vector>


void binary_search_vec(std::vector<int> a, int finder) {    

    auto full_beg = a.begin();
    auto beg = a.begin();
    auto end = a.end();
    auto mid = beg + (end - beg) / 2;

    std::cout << "MID AT THE BEGINNING: " << *mid << std::endl;
    while (mid != end && *mid != finder) {

        if (finder > *mid) {
          std::cout << "Finder > mid" << std::endl;
          beg = mid + 1;

        }
        else {  //(*mid > finder) 
          std::cout << "Finder > mid" << std::endl;
          end = mid;
        }
        mid = beg + (end - beg) / 2;
        std::cout << "Setting mid to " << *mid << std::endl;
    }
    
    if (finder == *mid) {
      std::cout << "Num found: " << finder << " at position: " << std::distance(full_beg, mid) << std::endl;
    }
}

int main() {
  std::cout << "Hello World!\n";
  std::vector<int> v = std::vector<int>();
  v.push_back(0);
  v.push_back(1);
  v.push_back(2);
  v.push_back(3);

  binary_search_vec(v, 1);
}

使用您的函数,当finder = 2时,前面的代码不起作用。

还要检查@Bob__ 的评论:while 中条件评估的顺序非常重要!

这是修复和更新的代码。 由 Bob___ 提供

void binary_search_vec(std::vector a, int finder) {

auto full_beg = a.begin();
auto beg = a.begin();
auto end = a.end();
auto mid = beg + (end - beg) / 2;


while (*mid != finder && mid != end) {

if (finder > * mid) {
      beg = mid + 1;

    }
    else {  //(*mid > finder) 


        end = mid;
    }
    mid = beg + (end - beg) / 2;

}
 if (finder == *mid) {
    std::cout << "Num found: " << finder << " at position Index: " << std::distance(full_beg, mid) << std::endl;

}
else std::cout << "Not Found!" << std::endl;

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM