1

重複の可能性:
線形検索と二分検索の違いは何ですか?

0 から 100 までの範囲内で 20 個のランダムな整数を生成するプログラムを作成します。配列を降順に並べ替えます。次に、ユーザーからの整数入力を受け入れます。次に、この番号を使用して配列を検索します。線形探索と二分探索のパフォーマンスを比較します。

これが私のコードです

import java.util.Arrays;    
import java.util.Scanner;

public class search {

    public static void main(String args[]) {
        int[] num = new int[20];
        for (int i = 0; i < num.length; i++) {

            num[i] = (int) (Math.random() * 101);
        }
        System.out.println("A list of 20 random intergers with 0 - 100");
        System.out.println(Arrays.toString(num));
        for (int j = 1; j < num.length; j++) {
            for (int k = 0; k < num.length - 1; k++) {
                if (num[k] < num[k + 1]) {
                    int hold = num[k + 1];
                    num[k + 1] = num[k];
                    num[k] = hold;
                }
            }

        }
        System.out.println("Array in descending order");
        System.out.println(Arrays.toString(num));
        Scanner input = new Scanner(System.in);
        System.out.print("Enter a number to search: ");
        int num2 = input.nextInt();
        int loop = 0;
        for ( int cnt = 0; cnt < num.length; cnt++ )
        {
            if ( num[cnt] == num2 )
            {
                loop = cnt;
                System.out.println(num2+ " found"); 
          }

        }
        System.out.println("Linear search - "+loop+ " loop(s)");
        int loop2 = 0;
        int low = 0;   // low element subscript
        int high = num.length - 1;  // high element subscript
        int middle;    // middle element subscript
        while ( low <= high ) {
            middle = ( low + high ) / 2;
            if ( num2 == num[ middle ] ) { 

            }
            else if ( num2 > num[ middle ] )
            {
              low = middle +1;
               loop2++;
            }
            else{
              high = middle - 1;   
               loop2++;
            }                      
      }
        System.out.println("Binary search - "+loop2+ " loop(s)");
    }
}

線形探索のループ回数を取得できます。しかし、二分探索のループ回数がわかりません。

4

2 に答える 2

0

アルゴリズムのコストをより反映するため、ループ カウントの代わりに比較カウントを使用することをお勧めします。比較を簡単に数えることができます。ただし、この特定のケースでは、2 つがたまたま同等です。

int comparisons = 0;
while ( low <= high ) {
   middle = ( low + high ) / 2;
   ++comparisons;
   if ( num2 > num[ middle ] ) {
      low = middle +1;
   }
   else if ( num2 < num[ middle ] ) {
      high = middle - 1;   
   }
   else {
      break;
   }               
}
System.out.println( "Binary search - " + comprisons + " loop(s)");
于 2012-10-21T10:18:01.487 に答える