C 如何比较两种功能的效率?

C 如何比较两种功能的效率?,c,time-complexity,big-o,C,Time Complexity,Big O,其中一个是n*sqrt(n),另一个是n*log(n)*log(n)。有什么方法可以计算出哪一个更有效?从0,1,…开始绘制n各种值的图形,并观察哪个函数增长得更高增长率较低的更有效。 我附上两种功能的图形图片: 左边是n*log(n)*log(n),右边是n*sqrt(n)。您可以看到,n*log(n)*log(n)的增长幅度越来越小。因此它是有效的:)假设n*sqrt(n)和n*log(n)*log(n)是两个函数的复杂性(大O),您需要比较这两个表达式 要快速、简便地比较两个简单表达式(

其中一个是
n*sqrt(n)
,另一个是
n*log(n)*log(n)
。有什么方法可以计算出哪一个更有效?

0,1,…
开始绘制
n
各种值的图形,并观察哪个函数增长得更高增长率较低的更有效。

我附上两种功能的图形图片:

左边是
n*log(n)*log(n)
,右边是
n*sqrt(n)
。您可以看到,
n*log(n)*log(n)
的增长幅度越来越小。因此它是有效的:)

假设
n*sqrt(n)
n*log(n)*log(n)
是两个函数的复杂性(大O),您需要比较这两个表达式

要快速、简便地比较两个简单表达式(又名函数),可以使用谷歌搜索

进来

y = x*log(x)*log(x), y = x*sqrt(x)
在搜索字段中,它将绘制两个图形,您可以对它们进行比较

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

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

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

大O符号是为了给你一个快速的印象,而不需要计算太多。因此,在许多情况下,创建一个图表可能是过分的

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

  • O(1)
  • O(对数n)
  • O(n)
  • O(n²)
  • O(北卡罗来纳州)
其中
O(1)
是最快的,并且每个都比之前的慢。当然有,但是你会一直看到那5个

在你的例子中。你只需要知道这一点

  • O(n²)=O(n)*O(n)
  • O(logn)
    O(n)
因此:

O(logn)*O(logn)
O(n)*O(n)

(因为快*快比慢*慢快)

因此:

x*O(logn)*O(logn)
x*O(n)*O(n)

其中一个是
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)

则没有区别。您可以通过执行一个普通程序进行经验分析,如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);
    }
}
公共类算法测试{
公共静态void main(字符串[]args){
最终整数n=1024;
int sum1=0;
int-sum2=0;
int b=2;
对于(int i=0;i对于(intj=1;j Simplify:compare
sqrt(n)
to
log(n)*log(n)
你想比较
sqrt
log
的时间复杂度吗?你应该提到用于创建图表的在线网站。:)必须提到这个名字吗?总之,我用了
fooplot