2017-02-23 13 views
1

このバイナリ検索で何が問題なのかわかりました。コメントアウトされた行があり、これまで必要だったとは思っていないので、私が考えることができるのはその行を削除することだけです。それ以外に、私は何かが欠けていると思うことはできません - 間違っていることが本当に明白なものがありますか?バイナリ検索でエラーが発生しましたJava

public boolean search(int val) { 
    int low = 0; 
    int high = size-1; 
    int middle = -1; 
    boolean found = false; 
    while (!found && low < high) { 
     middle = low + (high-low)/2; 
     if (a[middle] == val) 
      found = true; 
     else if (a[middle] < val) 
      low = middle + 1; 
     else // (a[middle] > val) 
      high = middle - 1; 
    } 
    return found; 
} 
+0

最終的な 'else'には'!(a [middle] == val) 'と'!(a [middle] OldCurmudgeon

+0

あなた自身で問題を見つけることができます。配列 '[1,2]'を入れて '2'を探します。 – OldCurmudgeon

答えて

1

あなたは、アレイ内の2つの値を持っているときのケースを見てみましょう:

int low = 0; 
int high = size-1; // high = 1 
int middle = -1; 
boolean found = false; 
while (!found && low < high) { 
    middle = low + (high-low)/2; // middle = 0 + (1-0)/2 = 0 
    if (a[middle] == val) // FALSE (because a[0] = 0) 
     found = true; 
    else if (a[middle] < val) // TRUE (because a[0] = 0 and 0 < 1) 
     low = middle + 1; // low = 0 + 1 = 1 
    else // (a[middle] > val) 
     high = middle - 1; 
} 
return found; 

1 =低いので、あなたがから抜け出す:[0、1]あなたが値1を探しのコードを実行してみましょうこのループは条件がlow < highで、配列に1が入っていてもfalseを返します。

middle = low + (high-low)/2;はintを使用しており、切り捨てられるという問題が原因です。

0

で行くと読むことがあなたのコードをより簡単にできます...

middle = low + (high-low)/2; 
if (a[middle] == val) { 
    found = true; 
    break; 
} 

if (a[middle] < val) { 
    low = middle + 1; 
} else { 
    high = middle - 1; 
} 

私は今、それが明確になると思いますが、そのコメントは本当に何を言っている - それは単にこれが場合であることを表します[中]> val。

+0

ありがとう、申し訳ありませんが、それは説明されているときにとても明らかです! –

+0

あなたは大歓迎です。そのような問題をデバッグすることは...プログラミングを学ぶ上で不可欠な部分です。あなたはその*デバッグ*アスペクトのためにSOに変わってはいけません。デバッガの使い方を学ぶ。少なくともあなたのコードにトレースステートメントを追加する方法**をしていることを観察する**ことができます。 – GhostCat

0

検索する配列を[1,2]にしてください。

は、コードを歩く:

スタート:low = 0, high = 1。 ステップ1:middle = 0 - 一致しない(1 < 2)so low = 1。 ループチェック - low < high? NO - 検索を停止します。

関連する問題