简单循环的大 O 表示法
Big O Notation for simple loop
我刚开始学习数据结构class,老师们发了10个问题,问了其中一个的大O。根据我读过的帖子,我假设这段代码的大 O 是 O(1),因为数据参数是单个数据元素。但是,它确实会根据数字的大小执行多次,所以这会使它成为 O(N)?
public class Main {
public static void main(String[] args) {
f(100000);
}
public static long f (int n) {
long sum = 0;
for (long i = 2; i < n; i = i * i) {
sum += i;
System.out.println(sum);
}
return sum;
} // end f
}
这个函数的时间复杂度为O(log(log(n))。
i
通过乘以一个指数增长的因子来增长,所以这就是 "double exponential growth"(不确定这是否是一个有效的定义),复杂度是相反的。您可以阅读有关此 class 复杂性 here.
的更多信息
使用 Sigma 符号分析您的算法
要严格分析算法的增长,可以使用如下 Sigma 表示法:
与:
我们还假设,在使用 (*)
结果的等式中,对于某个正整数 j
。对于此假设不成立的 n
的值,只需删除上面 k
的总和中的 floor function。
结果:对数-对数时间复杂度
从上面可以看出,您的算法显然具有 log-logarithmic 时间复杂度,即(渐近上限)O(log(log n))
.
我刚开始学习数据结构class,老师们发了10个问题,问了其中一个的大O。根据我读过的帖子,我假设这段代码的大 O 是 O(1),因为数据参数是单个数据元素。但是,它确实会根据数字的大小执行多次,所以这会使它成为 O(N)?
public class Main {
public static void main(String[] args) {
f(100000);
}
public static long f (int n) {
long sum = 0;
for (long i = 2; i < n; i = i * i) {
sum += i;
System.out.println(sum);
}
return sum;
} // end f
}
这个函数的时间复杂度为O(log(log(n))。
i
通过乘以一个指数增长的因子来增长,所以这就是 "double exponential growth"(不确定这是否是一个有效的定义),复杂度是相反的。您可以阅读有关此 class 复杂性 here.
使用 Sigma 符号分析您的算法
要严格分析算法的增长,可以使用如下 Sigma 表示法:
与:
我们还假设,在使用 (*)
结果的等式中,对于某个正整数 j
。对于此假设不成立的 n
的值,只需删除上面 k
的总和中的 floor function。
结果:对数-对数时间复杂度
从上面可以看出,您的算法显然具有 log-logarithmic 时间复杂度,即(渐近上限)O(log(log n))
.