2016-03-19 17 views
0

私は、Javaプログラミングを学習し、炭の配列にシンボルを見つけるために、バイナリ検索を使用するプログラムを作っています。しかし、私がのシンボルでないとでないとの配列で検索しようとすると、私のプログラムは無限のサイクルになります。そのようなシンボルが配列にない場合、どのようにエラー・サインを作成するのか分かりません。ここに私のプログラムのコードですJavaのBinarySearchプログラム

import java.lang.reflect.Array; 
import java.util.Arrays; 

public class Main { 
    public static void main(String[] args){ 
     char[]arr = {'a','d','f','l','o','z'}; 
     find(arr,'m'); 

    } 
    public static void find(char[]arr,char ch){ 
     int last = arr.length-1; 
     int mid=last; 
     while (arr[mid] != ch){ 
      if (arr[mid]<ch){ 
       mid = (last+mid)/2; 
      } 
      else{ 
       last=mid; 
       mid=last/2; 
      } 
     } 
     System.out.print(mid); 
    } 
} 

ありがとうございます。

+0

変更されていないものを見つけるためにデバッガを実行します。注: 'mid == last/2'の場合、これは何も変更されません。 –

+0

あなたは暗黙のうちに検索の下限のインデックスが常に0であると仮定しています。良い教科書またはインターネット上の "バイナリ検索"の説明をチェックしてください。 – laune

+0

@PeterLawrey 'mid = last/2'より前の' last = mid'は、 "何も変わらない"ように思われます。しかし、「最初の」遺跡のパフォーマンスはありません。 – laune

答えて

0

whileループから抜け出すケースはなく、2つのケースが間違っている間に変数に割り当てられた変更された値はありません。また、要素がif-elseラダーで見つかったときもチェックし、要素が見つかったかどうかを示す変数(found)を使用する必要があります。さらに、下限(最初)、中間と上限(最後)に3つの変数を使用する方が良いでしょう。以下のコードは、find()メソッドのリビジョンです。

public static void find(char[]arr,char ch){ 
    int first=0,mid=0,last=arr.length-1,found=0; 
    while (first<=last){ 
     mid=(last+first)/2; 
     if(arr[mid]==ch){ 
      System.out.print(ch+" found at index "+mid); 
      found=1; 
      break; 
     } 
     else if(arr[mid]<ch){ 
      first=mid+1; 
     } 
     else if(arr[mid]>ch){ 
      last=mid-1; 
     } 
    } 
    if(found==0) 
    System.out.print(ch+" was not found "); 
} 

これは問題なく動作しますが、この方法を使用する必要があります。

0

find()メソッドでいくつかの変更を加える必要があります。midの値が決してlastの値を超えないようにチェックしてください。したがって、whileループ条件をそれに応じて変更する必要があります。第二に、終了条件if(arr[mid]==ch)をループから出さなければなりません。 これはまた、2つの変数lo & hiを理解することによって容易に行うことができます& implement.See implementation here here Binary Searchを参照してください。

以下は上記のコードの要件ごとに、のみのみlast & mid変数を使用したソリューションです。

public static void find(char[]arr,char ch){ 
     int last = arr.length-1; 
     int mid=last/2; 
     while (mid<=last){ 
      if(arr[mid] == ch) //if found, Print and exit the loop 
      { 
       System.out.println("found at:"+mid); 
       return; 
      } 

      if (arr[mid]<ch){ 
       mid=((last+mid)/2)+1; 
      } 
      else{ 
       last=mid-1; 
       mid=last/2; 
      } 
     } 
     System.out.println("Not found!!"); 
    } 
-2

あなたはArraysクラスのbinarySearchメソッドを使用することができますcharの配列にシンボルを見つけるために。

構文:例えばだから、

Arrays.binarySearch(a, key); 

char[] arr = {'a','d','f','l','o','z'}; 

あなたは配列にない文字や記号を検索したい場合は、出力がされます-1本、

のように
System.out.println("The char 'b' is at index : " + Arrays.binarySearch(arr, 'b') + "."); 

出力は次のようになります。

The char 'b' is at location : -1. 

詳しくは、binary search algorithmを参照してください。

+1

彼は自分のコードに何が問題なのかを知りたがっています。この回答はその問題に対処していません –

+0

これは質問への答えを提供しません。十分な[評判](https://stackoverflow.com/help/whats-reputation)があれば、[投稿にコメントする]ことができます(https://stackoverflow.com/help/privileges/comment)。代わりに、[質問者からの明確化を必要としない回答を提供する](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- i-do-代わりに)。 - [レビューの投稿](レビュー/低品質の投稿/ 17606477) – fandro

+0

新しい質問がある場合は、[質問する](https://stackoverflow.com/questions/ask)ボタンをクリックして質問してください。コンテキストを提供する場合は、この質問へのリンクを含めてください。 - [レビューから](/レビュー/低品質の投稿/ 17606477) –

関連する問題