对Big O符号感到困惑

时间:2013-03-16 22:03:00

标签: java big-o

我有两个问题:

public static void method1(int[] a, int[] b) {
   int sum1 = 0, sum2 = 0;

   for(int i = 0; i < a.length; i++) {
      sum1 += a[i];
   }

   for(int i = 0; i < b.length; i++) { 
      sum2 += b[i];
   }
}

问题1:这是否在O(n)中? method1中有多少循环(不是嵌套循环)?

问题2:如果有

怎么办?
Arrays.sort(a);

method1内,它的功能是什么?

2 个答案:

答案 0 :(得分:7)

  

问题1:这是否在O(n)?

这是正确的(这里,n表示两个数组中每一个的长度。)

  

在method1中有多少循环(不是嵌套循环)是否重要?

只要循环数固定,并且每个循环中的迭代次数在n中是线性的,它就不会。更正式的是,如果C是常量,C*nO(n)

  

问题2:如果有Arrays.sort(a);

怎么办?

排序通常为O(n logn),这就是Arrays.sort(int[])平均 。对于最坏情况的表现,documentation含糊不清:

  

该算法在许多数据集上提供O(n log(n))性能,导致其他快速降序降级为二次性能,并且通常比传统(单枢轴)Quicksort实现更快。

这显然不足以保证最坏情况中的O(n logn)。在行之间阅读表明它可能是O(n^2)

值得注意的是,在JDK7中,Arrays.sort(Object[])使用的算法与Arrays.sort(int[])使用的算法不同。前者是TimSort的改编版,因此应保证O(n logn)最坏情况下的表现。不幸的是,文档再次没有拼写出来。

答案 1 :(得分:1)

  1. 一个。它是O(n),其中n =输入长度(总)
    湾是的,它有多少循环:如果它是一个恒定数量的循环k那么它是O(k * n)通常被认为是O(n)但是如果k> = n它应该被考虑的东西< / p>

  2. Arrays.sort(a);是使用合并排序实现的,在平均和最差的情况下都在O(n log n)中运行(不像NPE所说的那样!)。

  3. MrSmith42的更新:

    来自http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html
    sort(Object [])使用的算法不一定是MergeSort,但它必须是稳定的。)

    还有:

    实施说明:排序算法是Vladimir Yaroslavskiy,Jon Bentley和Joshua Bloch的Dual-Pivot Quicksort。该算法在许多数据集上提供O(n log(n))性能,导致其他快速排序降级为二次性能,并且通常比传统(单轴)Quicksort实现更快。