Странные результаты времени при измерении производительности двоичного и линейного поиска

Следующая программа работает как ожидалось / требуется, но время выполнения не имело смысла.

В моем классе Data Structures нам пришлось написать программу для проверки эффективности алгоритма. Возьмите массив и заполните его случайными числами, а затем верните количество всех элементов, равное другому случайному числу. Мы должны были сделать это, используя линейный поиск, а затем бинарный поиск, с массивом из 100 элементов, затем 1k, затем 10k, затем 100k и 1m элементов. Большинство из нас в классе заметили, что при линейном поиске 10 тыс. Элементов требуется больше времени, чем 100 тыс. Элементов.

Мой включил цикл, в котором после завершения обоих поисков массив был расширен и удален, так что это не проблема с кодом. Это происходило только при таком размере, и не имело значения, были ли запущены другие программы или нет. Мы решили, что это потому, что время обработки каждого поиска шло так быстро, что у системы не было времени использовать больше ресурсов, но когда она приблизилась к 10 тыс., Она начала использовать больше, что привело к сокращению времени поиска на 100 тыс. Есть ли другие возможности?

package cmsc350;
/**
 * TestExecutionTime - Create two int arrays and fill with random numbers, create
 * random integer.  Search first array for values less than single integer, calculate
 * time to run, output "hits" and run time.  Scan both arrays for common values,
 * calculate time to run, output "hits" and run time.  Repeat 10 times, calculate
 * average run times.  After 10 runs, increase array size by 10x and repeat.
 * @author Rickie
 */
public class TestExecutionTime {
    int[] array1 = new int[100];
    int[] array2 = new int[100];
    //Create array for storing time, storing average time
    long[][] timeArray = new long[50][2];
    long[][] average = new long[5][2];
    int value;


/**
 * Main method - Initialize all arrays, increase array size as needed, call
 * required methods and calculate run time for each pass.
 */
public void runApp(){
    int arrayLength = 100;
    int resultCount;
    long startTime, endTime;
    int counter = 0;
    //Initialize average time array
    for(counter = 0; counter < 5; counter++){
        average[counter][0]=0;
        average[counter][1]=0;
    }
    //Expand array size by 10x after ten passes, call average time method
    for (counter = 0; counter < 50; counter++){
        if (counter%10 == 0 && counter > 0 ){
            System.out.println("Calling ave");
            aveTime(counter);
            arrayLength = (100*((int)Math.pow(10,(counter/10))));
            array1 = new int[arrayLength];
            array2 = new int[arrayLength];
        }
        //Fill arrays and single integer with random numbers between 1 and 99999
        for(int n = 0; n < arrayLength; n++)
            array1[n] = (1 + (int)(Math.random() * 99999));
        for(int k = 0; k < arrayLength; k++)
            array2[k] =(1 + (int)(Math.random() * 99999));
        value = 1 + (int)(Math.random() * 99999);
        //Display pass count and array length
        System.out.print(counter +1+ " " + array1.length + ":  ");
        //Get time, call less than method, get time
        startTime = System.nanoTime();
        resultCount = nbLessThan(array1, value);
        endTime = System.nanoTime();
        //Calculate run time, store in time array, display hits and run time
        timeArray[counter][0] = endTime-startTime;
        System.out.print(resultCount + " " + (timeArray[counter][0]) + " ns   ");
        //Get time, call common value method, get time
        startTime = System.currentTimeMillis();
        resultCount = nbCommonValues(array1, array2);
        endTime = System.currentTimeMillis();
        //Calculate run time, store in time array, display hits and run time
        timeArray[counter][1] = endTime-startTime;
        System.out.println(resultCount + " " + (timeArray[counter][1]) + " ms");
        }
    //Call average time method for final ten passes.
    aveTime(counter);
    }

/**
 * Calculate average time for 10 runs, display average times
 * @param start - int value used for start and end point of the for loop
 */
private void aveTime(int start){
    int index = start/10 - 1;
    for(int counter = start-10; counter < start; counter++){
        average[index][0] =average[index][0]+ (timeArray[counter][0]);
        average[index][1] =average[index][1]+ (timeArray[counter][1]);
    }
    average[index][0] = average[index][0]/10;
    average[index][1] = average[index][1]/10;
    System.out.println("Ave " + array1.length + ": " + average[index][0] + " " + average[index][1]);
}

/**
 * Scan array for elements less than value
 * @param array
 * @param value
 * @return int count - Number of terms in array less than int value
 */
private int nbLessThan(int[] array, int value){
    int count = 0;
    for (int n = 0; n < array.length; n++){
        if (value > array[n])
            count++;
    }
    return count;
}

/**
 * Scan arrays for common elements, count duplicates
 * @param array1
 * @param array2
 * @return int count - Number of common terms between arrays
 */
private int nbCommonValues(int[] array1, int[]array2){
    int count = 0;
    for(int n = 0; n < array1.length; n++){
        for (int k=0; k < array2.length; k++){
            if(array1[n]==array2[k])
                count++;
        }
    }
    return count;
}

}

0 ответов

Другие вопросы по тегам