Искать в массиве число 10 раз и вычислять время для каждого поиска

Я хочу создать массив с 10 миллионами чисел от 1 до 10 миллионов. Я использую цикл для заполнения массива (с шагом 1). Теперь я хочу найти первый массив 10 раз (создать цикл для поиска 10 раз) со вторым массивом чисел (например, int arr2[] = {10, 20, .....}. Затем я хочу вычислить время, которое потребовалось для каждого поиска, среднее и стандартное отклонение, а затем распечатать результат в виде таблицы. Таблицу, которую я просто распечатал с помощью "\t", это то, что я до сих пор:

public class LinearBinearySearch {

    public static void main(String[] args) {

        System.out.println("By linear search:\n" + check[k] + " found at index " + found +"\t");
        System.out.println("Table below shows result:");
        System.out.print("First run\tSecond run\tThird run\tFourth run\tFifth run\tSixth run\tSeventh run\tEight run\tNinth run\tTenth run\tAverage \tStandard deviation\n");

        arrPoplte();

        linSrch();


        loopCheck();
    }


static int i = 0;
static int k = 0;
static int[]Arr = new int[10000000];
static int[]check = {500, 10000, 100000, 1000000, 5000000, 7000000, 10000000};
public static void loopCheck(){


}

public static void arrPoplte(){
    for(int i = 0; i < Arr.length; i ++){
        Arr[i] = i + 1;

    }

}
static int found = 0;
static long start;
static long end;
public static void linSrch(){



    long sum = 0;
    long sumSquare = 0;

        for(int c = 0; c < 10 ; c++){

        start = System.nanoTime();
        while(Arr[i]<check.length){
            if(Arr[i]==check[i])
                System.out.print(Arr[i]);
            end = System.nanoTime();
             sum += end - start;
                sumSquare += Math.pow(end - start, 2);
        }









    System.out.print((end - start) +"\t\t");
        }
        double average = (sum * 1D) / 10;
        double variance = (sumSquare * 1D) / 10 - Math.pow(average, 2);
        double std = Math.sqrt(variance);
        System.out.print(average +"\t\t" + std + "\n");    

но 1. я думаю, что это слишком много кодов и 2. я не могу перебрать второй массив, чтобы использовать значение для первого включения.

Это мой желаемый результат: 500 был найден при любом индексе 1-й запуск 2-й запуск............. 10-й запуск Avg Standard dev. х мс у мс г мс ав мс, что бы это ни было

Как я могу настроить свой код для получения желаемого результата.

Я заранее прошу прощения за такой длинный вопрос, и я надеюсь, что кто-то может мне помочь Спасибо

1 ответ

Проще говоря, в вашем коде много чего плохого. Во-первых, он не работает на моем компьютере (и даже не скомпилируется, учитывая, что вы вставили на SO).

Итак, я переписал это, потому что я не мог понять, что происходит. Я также включил комментарии, которые, я надеюсь, будут полезны.

import java.util.Random;

public class SearchBenchmark {

    public static void main(String[] args) {
        SearchBenchmark sBenchmark = new SearchBenchmark(); // I don't like the word 'static'. You can disregard all of
                                                                // this
        sBenchmark.init();  // Execute the meat of the program
    }

    private void init() {

        int maxAttempts = 10;   // Set how many times we're doing this

        long[] times = new long[maxAttempts];   // Create something to hold the times which we want to run this
        int[] range = populateArray(10000000);  // Initialise the array with the given range

        Random rand = new Random(); // Create random integer generator
        int[] target = new int[maxAttempts];    // Create an array filled with the target of our searches

        // Populate target with random integers, since having preselected ones will bias your sample.
        for (int x = 0; x < target.length; x++) {
            target[x] = rand.nextInt((10000000 - 1) + 1) + 1;
        }

        // Execute the attempts
        for (int attempt = 0; attempt < maxAttempts; attempt++) {

            long startTime = System.nanoTime(); // Starting time

            int result = search(range, target[attempt]);    // Find it
            if (result == 0) {
                throw new RuntimeException("It's not in the range.");   // Make sure we actually have it
            }

            long endTime = System.nanoTime();   // Ending time
            long elapsed = endTime - startTime; // Difference
            times[attempt] = elapsed;   // Save the elapsed time
        }

        // ==== Summarisation section ====

        // Print out times and produce a sum
        int sum = 0;
        for (int attempt = 0; attempt < maxAttempts; attempt++) {
            sum = (int) (sum + times[attempt]);
            System.out.println("Attempt " + attempt + " took " + times[attempt] + " nanoseconds");
        }

        // Print out average
        int average = sum / maxAttempts;
        System.out.println("Average time: " + average + " nanoseconds");

        // Create and print the standard deviation
        int sumSquares = 0;
        for (int x = 0; x < maxAttempts; x++) {
            sumSquares = (int) (sumSquares + Math.pow(times[x] - average, 2));
        }

        int std = (int) Math.sqrt(sumSquares / maxAttempts);
        System.out.println("Standard deviation: " + std + " nanoseconds");
    }

    /**
     * Searches for the target within a range of integers
     *
     * @param range to search within
     * @param target to find
     * @return the target if it exists, otherwise, 0
     */
    private int search(int[] range, int target) {
        for (int x : range) {   // Iterate through the entire range
            if (x == target) { return x; }  // If you found it, return it and stop searching
        }

        return 0;   // If we can't find it, return 0
    }

    /**
     * Creates and populates an array from 0 to a variable <code>i</code>
     *
     * @param i the maximum amount to which the array should be populated
     * @return an array with the range contained within
     */
    private int[] populateArray(int i) {
        int[] array = new int[i];   // Create an array of the size indicated
        for (int x = 0; x < i; x++) {   // Populate that array with the range desired
            array[x] = x;
        }
        return array;   // Give it back
    }
}
Другие вопросы по тегам