如何比较两个函数之间的效率?

时间:2016-09-06 04:36:50

标签: c time-complexity big-o

其中一个是n*sqrt(n),另一个是n*log(n)*log(n)。有没有办法计算哪一个更有效?

5 个答案:

答案 0 :(得分:6)

假设n*sqrt(n)n*log(n)*log(n)是两个函数的复杂度(Big O),则需要比较两个表达式。

为了快速简单地比较两个简单的表达式(又称函数),你可以使用谷歌搜索。

输入

y = x*log(x)*log(x), y = x*sqrt(x)

在搜索字段中,它将绘制两个图形,您可以比较它们。

或者,您可以减去以下函数:

y = x*log(x)*log(x) - x*sqrt(x)

然后你有一个图表,你可以很容易地检查结果何时大于/小于零。

答案 1 :(得分:2)

n开始的0,1,...的各种值的绘图图,并观察哪个函数变得更高。 增长较少的人效率更高。

我附上两个功能的图表图片:

enter image description here

左边一个是n*log(n)*log(n),右边一个是n*sqrt(n)。你看,n*log(n)*log(n)越来越高了。所以效率很高:)

答案 2 :(得分:0)

Big-O-Notation旨在给您一个快速印象,没有计算很多。因此,在许多情况下创建图表可能会过度。

Big-O表示法中常见的嫌疑人是:

  • O(1)
  • O(log n)
  • O(n)
  • O(n²)
  • 为O(n C

O(1)最快,每个都比前一个慢。当然存在more,但是你会一直看到这些。

在你的例子中。只需知道

  • O(n²) = O(n) * O(n)
  • O(log n)O(n)

因此如下:

O(log n) * O(log n)O(n) * O(n)

(因为快*快比慢*慢)

因此如下:

x * O(log n) * O(log n)x * O(n) * O(n)

答案 3 :(得分:0)

  

其中一个是n*sqrt(n),另一个是n*log(n)*log(n)。哪一个更有效率?

简化

n*sqrt(n) versus  n*log(n)*log(n)
compares the same as 
sqrt(n) versus  log(n)*log(n)
compares the same as 
n versus  power(log(n),4)

注意增长和两个

的比率f(n)/g(n)
  n        power(log(n),4)  ratio
      1          0             - 
     10          1             10
    100         16             12.3...
   1000         81             39.0...
  10000        256            160.0
 100000        625            771.6...
1000000       1296           4164.9...

如果比率趋于无穷大,n*log(n)*log(n)效率更高 如果比率趋于0,则n*sqrt(n)更有效 如果比率倾向于正常数,则效率相等。

结论:n*log(n)*log(n)效率更高。

注意:如果分析使用log10(n)log2(n)log(n)

,则没有区别

答案 4 :(得分:0)

您可以通过执行普通程序来经验地进行,如Java中的以下内容:

public class AlgoTest {
    public static void main(String[] args) {

        final int n = 1024;

        int sum1 = 0;
        int sum2 = 0;

        int b = 2;

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < Math.sqrt(n); j++) {
                sum1 ++;
            }
        }
        System.out.println("n*sqrt(n) = " + sum1);

        for (int i = 0; i < n; i++) {
            for (int j = 1; j <= n; j*=b) {
                for (int k = 1; k <= n; k*=b) {
                    sum2 ++;
                }   
            }
        }
        System.out.println("n*log(n)*log(n) = " + sum2);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < sub; j ++) {
                for (int k = 0; k < sub; k ++) {
                    sum3 ++;
                }
            }
        }
        System.out.println("[Sophisticated] n*log(n)*log(n) = " + sum3);
    }
}

其中sum1是复杂度为n * sqrt(n)的程序执行的迭代次数,下一次的复杂度为n * log(n)* log(n)。

我选择了base 2,因为log base和square root function之间存在轻微关系。