这个算法的大O复杂性是什么?

时间:2015-11-15 04:58:18

标签: java algorithm performance sorting big-o

我有一个我在下面写的功能。该函数本质上是一种合并排序。

public static long nlgn(double[] nums)  {

        if(nums.length > 1)     {
            int elementsInA1 = nums.length/2;
            int elementsInA2 = nums.length - elementsInA1;
            double[] arr1 = new double[elementsInA1];
            double[] arr2 = new double[elementsInA2];

            for(int i = 0; i < elementsInA1; i++)
            arr1[i] = nums[i];

            for(int i = elementsInA1; i < elementsInA1 + elementsInA2; i++)
            arr2[i - elementsInA1] = nums[i];

            nlgn(arr1);
            nlgn(arr2);

            int i = 0, j = 0, k = 0;

            while(arr1.length != j && arr2.length != k) {
                if(arr1[j] <= arr2[k]) {
                    nums[i] = arr1[j];
                    i++;
                    j++;
                } else {
                    nums[i] = arr2[k];
                    i++;
                    k++;
                }
            }

            while(arr1.length != j) {
                nums[i] = arr1[j];
                i++;
                j++;
            }
            while(arr2.length != k) {
                nums[i] = arr2[k];
                i++;
                k++;
            }
        }

        return nuts;
    }

由于这是一种合并排序,我从研究中得知,该算法的大O复杂度为O(n lgn)。但是,当我运行我的计时测试时,我得到的结果并不表明这是在O(n lgn)时间运行。看起来它似乎是O(n lgn)时间,因为直到我们在开始时到达两个for循环的末尾。它在O(n)时间内运行。一旦超过它,它应该在O(lgn)时间运行,因为它对每个元素进行排序。

我的问题是,有人可以确认这段代码是在O(n lgn)时间运行吗?如果没有,我想知道我的理解在哪里出错了。

2 个答案:

答案 0 :(得分:3)

O(nlogn)是一个渐近紧束缚。这意味着,只有当n足够大时,其运行时间才接近复杂性。当n很小时,由于函数调用开销和许多其他因素,边界不紧。

你可以使n更大,并比较输入之间的比率,看它是否接近O(nlogn)。虽然我真的怀疑你有多大才能成为......

答案 1 :(得分:1)

  

由于这是一种合并排序,我从研究中得知,该算法的大O复杂度为O(n lgn)。 [...]我的问题是,有人可以确认这段代码是在O(n lgn)时间内运行的吗?

无需显示,因为合并排序已经证明O(n lg(n))时间内运行。但是如果你想观察它,你需要为你的输入试验越来越大的值。您可能希望使用输入值和时间结果更新帖子。

  

然而,当我运行我的计时测试时,我得到的结果并不表明它在O(n lgn)时间内运行。 [...]如果没有,我想知道我的理解在哪里出错。

我认为你可能误解了Big-Oh符号实际上试图告诉你的内容。当输入变得足够大时,Big-O为您提供算法的渐近上界近似。 (如何&#34;大&#34;&#34;足够大&#34;因算法而异,需要通过实验找到。重点是该值 存在我们更抽象地代表它。)

换句话说,Big-O告诉您 由于这是最坏情况,这也意味着它在某些情况下可能表现更好,但我们通常不关心这些情况。 (如果你有兴趣,请看看Big-Omega和Big-Theta。)例如,如果你有一个足够小的&#34;&#34; list,merge-sort运行速度比快速排序快,这通常用作优化。

它也是近似值,因为常量和其他多项式项显示为符号的一部分。例如,时间复杂度为N的某些假设算法将写为500x^2 + 15x + 9000

放弃较低期限的一些原因包括:

  • 相对大小:由于O(n^2)趋于正无穷大,较大的n占主导地位;与最大/占主导地位的术语相比,较低的术语对总体成本的贡献越来越小 - 比如在湖中加入几滴水或一桶水;
  • 便利性:阅读和理解n^2比长而复杂的多项式更容易,没有真正的好处