二进制搜索C ++字符串不起作用

时间:2010-10-05 04:44:18

标签: c++ algorithm string search binary-search

以下代码有什么问题?为什么没有使用我的二进制搜索实现找到这封信?

#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>
#include <cwctype>
using namespace std;

bool contains(string s, char a){
  int m = 0;
  int n = s.length()-1;

  while (m != n) {
    int k = (m + n) / 2;
    if (s[k] == a)
      return true;

    if (s[k] < a) {
      n = k - 1;
    } else {
      m=k + 1;
    }
  }

  return false;
}

int main() {

  string s = "miyvarxarmaiko";
  char a = 'm';
  if (contains(s,a) == true) {
    cout << "s contains  character a" << endl;
  } else {
    cout << "does not contain" << endl;
  }

  return 0;
}

1 个答案:

答案 0 :(得分:15)

二进制搜索的先决条件是数组应排序

要对字符串s进行排序,您可以执行sort(s.begin(),s.end());

您的实施中还有一些错误:

if (s[k] < a) {
   n = k - 1; // Incorrect..should be m = k + 1
} else {
   m= k + 1;   // Incorrect..should be n = k - 1
}

<强>为什么吗

当键大于中间元素时,您需要将搜索范围缩小到中间元素的右半部分,然后将low(在您的情况下为m)更改为{{ 1}}(在您的情况下为mid+1)。同样,另一个案例也需要改变。

k+1

应该是

while (m!=n)

<强>为什么吗

考虑在字符串while (m<=n) 中搜索char 'a'的情况。您的"a"m都是n,因此0也是k。在您的情况下,根本不输入while循环。因此,通常当搜索范围缩小到一个元素并且恰好是您的密钥时,您的现有代码将失败。

提示

您的变量名称选择不佳。最好使用lowhighmid等名称。