为什么有时二进制搜索真的很长?

时间:2014-03-12 04:30:07

标签: java search

我编写了两个创建random int []的程序,然后生成随机的int来搜索。好吧,我真的只写了一个程序,然后修改了搜索方法(就像我应该为OOP做的那样,对吧?)。我使用System.nanoTime()来计算搜索过程中经过的时间。对于线性搜索,我一致得到10,000-13,000的值,对于二进制搜索,我得到的值大于5,000(在所有搜索的排序时间中平均,对于单独的搜索通常少于4,000)。但有时,它会通过超过13,000的后退时间,甚至比最长的线性搜索更长。

我在任务管理器(Windows)中将java优先级设置为Real Time。什么会导致搜索时间增加三倍或更多? FWIW,我在二进制中每3或4得到约1个线性尖峰,线性尖峰大约是正常时间的两倍(22,000是迄今为止最差的)。是否与我编写代码的方式有关?

如果你不想阅读整篇文章,在这两种情况下我都会在调用搜索方法和之后的行之前记录行中的时间,所以你可以跳过搜索方法,如果你认为可能是问题所在。报告该号码是从一个程序复制/粘贴到另一个程序,但二进制搜索程序有更多我认为有趣的报告。提前谢谢。

import java.util.Random;

public class LinearSearchTimer{

public static void main(String[] args){

    int[] numbers;
    final int MAX_RUNS;
    double time1, time2, timeSpent, timeTotal;
    int searchedNumber;
    Random rand = new Random();
    boolean result;
    boolean[] resultArr;
    int resultCounter;
    double pctTrue;

    MAX_RUNS = 1000;
    numbers = new int[MAX_RUNS];
    resultArr = new boolean[MAX_RUNS]; 
    resultCounter = 0;
    timeTotal = 0;


    //build array with random ints  
    for(int k = 0; k < numbers.length; k++){
        numbers[k] = rand.nextInt(10001);
    }


    //generate random number and search array for it, then store to result array
    for(int i = 0; i < numbers.length; i++){
        searchedNumber = rand.nextInt(10001);
        time1 = System.nanoTime();
        result = search(numbers, searchedNumber);
        time2 = System.nanoTime();
        resultArr[resultCounter] = result;
        resultCounter++;
        timeSpent = time2 - time1;
        timeTotal += timeSpent;

    }
    pctTrue = resultPercent(resultArr);
    System.out.println("Avg time : " + timeTotal / MAX_RUNS);
    System.out.println("Percent found: " + pctTrue * 100);


}

//search algorithm, returns true if found, false if not
public static boolean search(int[] numbers, int searchedNumber){
    int i = 0;
    boolean found = false;
    while (found == false && i < numbers.length){
        if (numbers[i] == searchedNumber)
            found = true;
    i++;
    }
    return found;
}

public static double resultPercent(boolean[] arr){
    int trueCount = 0;
    double result;
    double runs;
    for(boolean element : arr){
        if (element == true)
            trueCount++;
    }
    runs = arr.length;//for calculating percentage as a forced double
    result = trueCount / runs;
    return result;

}

    }

然后......

import java.util.Arrays;
import java.util.Random;

public class BinarySearchTimer{

public static void main(String[] args){

    //declare variables
    int[] numbers;
    final int MAX_RUNS;
    double time1, time2, timeSpent, timeTotal;
    int searchedNumber;
    Random rand; 
    boolean result;
    boolean[] resultArr;
    int resultCounter;
    double pctTrue;
    double timeSort1, timeSort2, timeSortSpent;

    //instantiate variables
    MAX_RUNS = 1000;
    numbers = new int[MAX_RUNS];
    resultArr = new boolean[MAX_RUNS]; 
    resultCounter = 0;
    timeTotal = 0;
    rand = new Random();


    //build array with random ints  
    for(int k = 0; k < numbers.length; k++){
        numbers[k] = rand.nextInt(10001);
    }

    //sort array
    timeSort1 = System.nanoTime();
    Arrays.sort(numbers);
    timeSort2 = System.nanoTime();
    timeSortSpent = timeSort2 - timeSort1;


    //generate random number and call search method
    for(int i = 0; i < numbers.length; i++){
        searchedNumber = rand.nextInt(10001);

        //get start time
        time1 = System.nanoTime();
        result = search(numbers, searchedNumber, 0, numbers.length - 1);
        //get end time
        time2 = System.nanoTime();


        resultArr[resultCounter] = result;
        resultCounter++;
        timeSpent = time2 - time1;
        timeTotal += timeSpent;

    }
    pctTrue = resultPercent(resultArr);
    System.out.println("Avg time : " + timeTotal / MAX_RUNS);
    System.out.println("Percent found: " + pctTrue * 100);
    System.out.println("Actual sort time: " + timeSortSpent);
    System.out.println("Sort time shared per search: " + timeSortSpent / MAX_RUNS);
    System.out.println("Effective average search time: " + (timeTotal / MAX_RUNS + timeSortSpent / MAX_RUNS));

}

//search algorithm, returns true if found, false if not
public static boolean search(int[] numbers, int searchedNumber, int low, int high){
    int mid = (high + low) / 2;
    if(low > high)
        return false;
    if(numbers[mid] == searchedNumber){
        return true;
    }
    else if(searchedNumber < numbers[mid]){
        mid--;
        return search(numbers, searchedNumber, low, mid);
    }
    else if(searchedNumber > numbers[mid]){
        mid++;
        return search(numbers, searchedNumber, mid, high);
    }
    return false;
}


public static double resultPercent(boolean[] arr){
    int trueCount = 0;
    double result;
    double runs;
    for(boolean element : arr){
        if (element == true)
            trueCount++;
    }
    runs = arr.length;//for calculating percentage as a forced double
    result = trueCount / runs;
    return result;

}

}

0 个答案:

没有答案