其中一个是n*sqrt(n)
,另一个是n*log(n)*log(n)
。有没有办法计算哪一个更有效?
答案 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,...
的各种值的绘图图,并观察哪个函数变得更高。 增长较少的人效率更高。
我附上两个功能的图表图片:
左边一个是n*log(n)*log(n)
,右边一个是n*sqrt(n)
。你看,n*log(n)*log(n)
越来越高了。所以效率很高:)
答案 2 :(得分:0)
Big-O-Notation旨在给您一个快速印象,没有计算很多。因此,在许多情况下创建图表可能会过度。
Big-O表示法中常见的嫌疑人是:
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之间存在轻微关系。