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:comparesqrt(n)
tolog(n)*log(n)
你想比较sqrt
与log
的时间复杂度吗?你应该提到用于创建图表的在线网站。:)必须提到这个名字吗?总之,我用了fooplot
。