在数组中搜索一个数字 10 次并计算每次搜索的时间

Posted

技术标签:

【中文标题】在数组中搜索一个数字 10 次并计算每次搜索的时间【英文标题】:search an array for a number 10 times and calculate the time for each search 【发布时间】:2015-02-08 19:13:45 【问题描述】:

我想创建一个包含从 1 到 1000 万的 1000 万个数字的数组。我正在使用循环来填充数组(增量为 1)。现在我想用第二个数字数组(例如 int arr2[] = 10, 20, .....)搜索第一个数组 10 次(创建一个循环搜索 10 次)。然后我想计算每次搜索所花费的时间、平均值和标准差,然后将结果打印在表格中。 我将用“\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 次运行平均标准开发。 x ms y ms z ms av ms 不管是什么

如何调整我的代码以产生所需的输出。

对于这么长的问题,我提前道歉,希望有人能帮助我 谢谢

【问题讨论】:

请缩进您的代码以使其可读,即使是您自己。并尊重 Java 命名约定:变量以小写字母开头,并且使用整个单词:populateArray 而不是 arrPopltelinearSearch 而不是 linSrch。这听起来可能不重要,但它非常重要。如果你的大脑必须翻译所有内容并寻找打开和关闭大括号,它就无法专注于逻辑。 感谢 JB Nizet,我对此有点陌生。我会这样做并重新发布。希望你能帮助我 好的。只花了大约 10 分钟重新格式化代码,以便 Eclipse 甚至可以尝试编译它。搜索功能也有问题,不仅仅是打印系统…… 【参考方案1】:

简单地说,您的代码有很多问题。首先是它在我的计算机上不起作用(甚至无法编译,考虑到您粘贴到 SO 上的内容)。

所以,我重写了它,因为我无法对正在发生的事情做出正面或反面。我还包括了 cmets,希望对您有所帮助。

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
    

【讨论】:

以上是关于在数组中搜索一个数字 10 次并计算每次搜索的时间的主要内容,如果未能解决你的问题,请参考以下文章

有序数组中第K小的数字

在 C++ 中存储和搜索数字的最佳方法

所以我做了一个线性搜索代码,但是当我在数组中输入一个数字时,它仍然会打印(数字没有)为啥会这样?

二进制搜索算法:数组中每条记录的文本文件

C 调试中的递归线性搜索

生成 20 个随机数并在数组中搜索一个数字的程序