2016-09-06 5 views
0

こんにちはすべて私はバイナリ検索プログラムで作業しています。私のアルゴリズムは正しいですが、ドライバプログラムでプログラムを実行すると、このような表の代わりに値 "false"が返されます。 Table output(LINK)バイナリ検索プログラムの印刷偽

ここは私のドライバプログラムとメインプログラムです。

public class TestResulter { 

public static void main(String[] args) { 
    //Resulter resulter = new Resulter(); 
    int numberOfItems = 10000; 
    int item; 
    int a[ ] = new int[ numberOfItems ]; 


    for(int i = 0; i < 20; i++) 
    { 
     item = Resulter.randomitem(a); 
     System.out.println(Resulter.binarySearch(a , item)); 
    } 


} 

} 

私の主なプログラムはbinarySearchアルゴリズムです。

import java.util.Random; 

public class Resulter extends TestResulter { 
private static class Result { 
    public Boolean found; // true if found, false if not found 
    public int index; // index where item was found, -1 if not found 
    public int steps; // number of comparisons performed 

    public Result(boolean f, int ind, int st) { 
     found = f; 
     index = ind; 
     steps = st; 
    } 

    @Override 
    public String toString() { 
     return "Result [found=" + found + ", index=" + index + ", steps=" + steps + "]"; 
    } 
} 

public static boolean binarySearch(int[] a, int item) { 
    int start=0, end=a.length-1; 
    while(end>=start) { 
     int mid = start + ((end - start)/2); 
     if (a[mid] == item) 
      return true; 
     if (a[mid] > item) 
      end = mid-1; 
     else start = mid+1; 
    } 
    return false; 
} 


public static int randomitem (int[] a) { 
    int i; 
    Random random = new Random(); 
    int item = random.nextInt(10999); 
    for(i = 0; i < 10000; i++) 
    { 
     a[ i ] = random.nextInt(10000); 
    } 
    return item; 
} 
} 

私のプログラムは、私のリニアサーチプログラムから私の画像に同様の出力を持たせたいと思っています。

+0

配列 'a'を順序付けられていない乱数で埋めていることを正しく理解していますか?バイナリ検索は、ソートされた配列に対してのみ機能します。 – Beethoven

+0

かなり、だから私はアルゴリズムの仕事を取得し、実際にテーブルを印刷する方法です。 –

+0

配列を塗りつぶした後に配列がソートされることを宣言するために、コードのいくつかを改訂する必要があります。もう1つの問題は、 'binarySearch'メソッドが' Result'オブジェクトを返さず、 'boolean'を返すことです。私は以下のいくつかのコードで回答を掲示します。 – Beethoven

答えて

-1

あなたのmain機能にヒカップアップがあります。 int a[]int[] aに変更してください。

また、randomitemで実行される論理アクションは、おそらく寄与する要素です。検索配列aから引き出されていないbinarysearchが使用するitemが返されますが、ランダムに生成されます。お試しくださいreturn a[random.nestIng(a.length)];

私はモバイルアプリケーションを使用していますので、私の構文は完璧ではないかもしれません。ここで

+0

ありがとう、私はそれを追加します何が起こるか見ることができます。 –

+0

私は戻り値を追加しますか?[random.nestIng(a.length)]; binarysearchメソッドまたはrandom itemメソッドの最後に? –

+0

randomitemの古いreturn文を置き換えます。 –

2

は、いくつかの変更やリファクタリングを使用してコードです:

public class TestResulter 
{ 
    public static void main(String[] args) 
    { 
     int numberOfItems = 10000; 
     int item; 
     int[] a = new int[numberOfItems]; 
     fillArray(a); 

     for(int i = 0; i < 20; i++) 
     { 
      item = Resulter.randomitem(a); 
      System.out.println(Resulter.binarySearch(a, item)); 
     } 
    } 

    private static void fillArray(int[] a) 
    { 
     Random random = new Random(); 
     for(int i = 0; i < a.length; i++) 
      a[i] = random.nextInt(10000); 
     Arrays.sort(a); 
    } 
} 

public class Resulter 
{ 
    private static class Result 
    { 
     public boolean found; // true if found, false if not found 
     public int index; // index where item was found, -1 if not found 
     public int steps; // number of comparisons performed 

     public Result(boolean f, int ind, int st) 
     { 
      found = f; 
      index = ind; 
      steps = st; 
     } 

     @Override 
     public String toString() 
     { 
      return "Result [found=" + found + ", index=" + index + ", steps=" + steps + "]"; 
     } 
    } 

    public static Result binarySearch(int[] a, int item) 
    { 
     int start=0, end=a.length-1; 
     int stepCount = 0; 
     while(end>=start) 
     { 
      stepCount++; 
      int mid = start + ((end - start)/2); 
      if(a[mid] == item) 
       return new Result(true, mid, stepCount); 
      else if(a[mid] > item) 
       end = mid-1; 
      else 
       start = mid+1; 
     } 
     return new Result(false, -1, stepCount); 
    } 


    public static int randomitem(int[] a) 
    { 
     return new Random().nextInt(10000); 
    } 
} 

私はそれを見るように、あなたの溶液中での主な問題は以下の通りであった。

  1. 配列がソートされませんでした。バイナリ検索はソートされた配列でしか機能しないため、Arrays.sort(a)コマンドです。
  2. binarySearchは、booleanを返しました。Resultオブジェクトではありません。これは印刷したいものです。
+0

わかりませんが、私はメソッドrandomitemが配列内のランダムな項目を返すべきであると感じています。 – LeHill

+0

@Le私は、項目が見つからない場合、つまり 'Result.found = false'のところでもテストしなければならないと考えました。しかし、あなたが正しいです、方法の名前は、あなたが言っていることを示唆しています。 – Beethoven

関連する問題