2017-10-24 4 views
0

目的はキーと配列項目の間の比較の数を返すことです。 私はJavaに慣れていて、ベストプラクティスを十分に理解していないので、私が変更すべきことがあれば教えてください。Javaバイナリとリニア検索アルゴリズムは正しく動作していますか?

public class BinaryVsLinear { 

private static int linearSearch(int key, int[] array){ 
    int count = 0; 
    for (int i = 0; i < array.length; i++){ 
     count++; 
     if (array[i] == key){ 
      i += array.length +1; 
     } 
    } 
    return count; 
} 

private static int binarySearch(int key, int[] array){ 

    int count = 0, l = 0, r = array.length -1; 
    while (l <= r){ 
     int m = (l+r)/2; 
     count++; 
     if (array[m] == key){ 
      return count; 
     } 
     count++; 
     if (array[m] < key){ 
      l = m + 1; 

     } 
     else{ 
      r = m - 1; 
     } 
    } 
    return count; 
} 
+0

どちらの入力もソートされていますか?バイナリ検索はソートされたデータに対してのみ機能し、ソートされたデータを処理している場合は線形検索を高速化できます(array [i]>キーのときに戻る) – phflack

+0

はい、両方の入力がソートされます。 –

答えて

0

コードは正しいですか、つまり、リニア検索とバイナリ検索の両方でどれだけの比較が実行されるかがカウントされます。あなたが初心者であるので、コードを書く際にはより良い習慣をお勧めします。

public class BinaryVsLinear { 

    private static int linearSearch(int key, int[] array) { 

     int count = 0; 

     for (int i = 0; i < array.length; i++){ 
      count++; 
      if (key == array[i]){ 
       break; 
      } 
     } 

     return count; 

    } 

    private static int binarySearch(int key, int[] array) { 

     // one variable per line 
     // use better names 
     int count = 0; 
     int left = 0; 
     int right = array.length -1; 

     while (left <= right){ 

      int middle = (left + right)/2; 

      count++; 
      if (array[middle] == key){ 
       return count; 
      } 

      count++; 
      if (key > array[middle]){ 
       left = middle + 1; 
      } else{ 
       right = middle - 1; 
      } 

     } 

     return count; 

    } 

} 

私は、それは好みの問題ですが、あなたは常にあなたのコードの読みやすさに注意を払う必要があり、より良い名などにいくつかの変数名を変更する、いくつかのスペースを追加しました。

+0

個人的な好み/会社の方針がこれを指示しますが、個人的に私は休憩と複数の返品を強く嫌います。 Ian Joynerのこの記事「シングルエントリー、シングルエグジット(SESE)ヒューリスティック」(http://ianjoyner.name/No_return.html)は、私の考えをまとめたものです。 –

+0

@ d.j.brown '個人的な好み/会社の方針がこれを指示するでしょう ' – davidbuzatto

+0

@ d.j.brownどのように休憩を変更することをお勧めしますか? –

関連する問題