【问题标题】:why are the averages time of 3 algorithms negative?为什么 3 种算法的平均时间是负数?
【发布时间】:2018-03-25 22:17:39
【问题描述】:

我必须使用大小从 10000 到 50000 的数组,步长为 10000,为所有三种算法提供相同的输入,并为每个输入重复执行 100 次,以纳秒为单位测量执行 (使用 System.nanoTime()),并以毫秒为单位报告平均时间。 这就是我在下面所做的,但有些平均值是负数,我不知道为什么?

import java.util.Arrays;

public class Sort{

   public static void main(String[]args){

      double[] arr5 = new double[50000];

      for(int i=0;i<arr5.length;i++)
         arr5[i] = Math.random();

      selectionSort(arr5,10000);
      bubbleSort(arr5,10000);
      quickSort(arr5,10000);

      selectionSort(arr5,20000);
      bubbleSort(arr5,20000);
      quickSort(arr5,20000);

      selectionSort(arr5,30000);
      bubbleSort(arr5,30000);
      quickSort(arr5,30000);

      selectionSort(arr5,40000);
      bubbleSort(arr5,40000);
      quickSort(arr5,40000);

      selectionSort(arr5,50000);
      bubbleSort(arr5,50000);
      quickSort(arr5,50000);
   }

   public static void selectionSort(double [] A,int n){
      int sum = 0;
      System.out.println("Algorithm 1");
      for(int s=0;s<100;s++){
         long arr[] = new long[100];

         long startTime = System.nanoTime();

         for(int i=0;i<n-1;i++){
            int min = i;
            for(int j=i+1;j<n;j++){
               if(A[j] < A[min])
                  min=j;}
            double tmp = A[i];
            A[i] = A[min];
            A[min]=tmp;}

         long endTime = System.nanoTime();

         arr[s] = endTime - startTime;
      //System.out.println(arr[s]);
         sum+=arr[s];
      }
      System.out.println("Average:" + ((sum/100)*Math.pow(10,-6)));

   }

   public static void bubbleSort(double A [],int n){
      int sum = 0;
      System.out.println("\nAlgorithm 2");
      for(int s=0;s<100;s++){
         long[] arr = new long[100];

         long startTime = System.nanoTime();

         for(int i=0;i<n-1;i++){
            for(int j=0;j<n-1-i;j++){
               if(A[j]<A[j+1]){
                  double tmp = A[j];
                  A[j] = A[j+1];
                  A[j+1] = tmp;}}}

         long endTime = System.nanoTime();

         arr[s] = endTime - startTime;
      //System.out.println(arr[s]);
         sum+=arr[s];
      }
      System.out.println("Average:" + ((sum/100)*Math.pow(10,-6)));

   }

//algorithm 3
   public static void quickSort(double A [],int n){
      int sum = 0;
      System.out.println("\nAlgorithm 3");
      long[] arr = new long[100];

      for(int i=0;i<100;i++){
         long startTime = System.nanoTime();

         Arrays.sort(A,0,n-1);

         long endTime = System.nanoTime();

         arr[i] = endTime - startTime;
      //System.out.println(arr[i]);
         sum+=arr[i];
      }
      System.out.println("Average:" + ((sum/100)*Math.pow(10,-6)));

   }

}

【问题讨论】:

  • 另一个问题是您正在创建数组:long arr[] = new long[100]; 在 for 循环内...

标签: java algorithm time-complexity analysis performanceanalytics


【解决方案1】:

用于计算的变量sumint 类型。当您增加sum 时,它会溢出,因为endTime - startTime 的结果是一个相当大的值。当sum 发生溢出时,它的值又回到最小值(为负),并再次继续增加。

修复:将sum的类型改为long

另一条评论

您的名为arr 的数组似乎是多余的,因为它们没有在计算中使用,并且在每个循环中都会重置。

例如,在您的 bubbleSort() 方法中。在for 循环中声明并初始化数组long[] arr = new long[100];for(int s=0;s&lt;100;s++)

现在这个数组arr目前唯一的用途就是将endTime - startTime的结果存储在索引s,然后用来增加sumsum+=arr[s];)。

如果这是它的唯一目的,为什么不直接使用 sum += endTime - startTime 并完全删除数组?

如果您确实打算跟踪此数组中的所有结果,那么您应该将 long[] arr = new long[100]; 移到 for 循环 for(int s=0;s&lt;100;s++) 之外,因为目前每次迭代都会重新声明和初始化它。

为了演示考虑这个小例子,它复制了您在 bubbleSort() 和其他方法中所做的事情:

for (int i = 0; i < 5; i++) {
    int[] arr = new int[5];
    arr[i] = (i + 1);
    System.out.println(Arrays.toString(arr));
}

输出是:

[1, 0, 0, 0, 0]
[0, 2, 0, 0, 0]
[0, 0, 3, 0, 0]
[0, 0, 0, 4, 0]
[0, 0, 0, 0, 5]

如果数组是在循环之前声明的,那么行为会更有意义:

int[] arr = new int[5];
for (int i = 0; i < 5; i++) {
    arr[i] = (i + 1);
    System.out.println(Arrays.toString(arr));
}

在这种情况下,输出是:

[1, 0, 0, 0, 0]
[1, 2, 0, 0, 0]
[1, 2, 3, 0, 0]
[1, 2, 3, 4, 0]
[1, 2, 3, 4, 5]

for 循环中将数组arr 的内容打印到控制台,你就会明白我的意思了。

【讨论】:

  • 是的,我刚刚发现了 int 错误,但我不明白重置每个循环的意思,你建议我做什么?
  • @user7150641 请阅读完整答案,他建议使用long
猜你喜欢
  • 1970-01-01
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-19
  • 1970-01-01
  • 2022-11-26
相关资源
最近更新 更多