我刚刚开始在数据结构类中,教师已经发布了10个问题,并向其中一个问了大O.根据我读过的帖子,我假设此代码的Big O为O(1),因为data参数是单个数据元素。但是,它会根据数字的大小执行多次,因此会使其成为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
}
答案 0 :(得分:1)
此函数的时间复杂度为 O(log(log(n))。
i
通过乘以指数增长因子而增长,从而使指数增长成倍增长&#34; (不确定这是否是一个有效的定义),复杂性是相反的。您可以阅读有关此类复杂性的更多信息here。
答案 1 :(得分:1)
要严格分析算法的增长,您可以使用Sigma表示法,如下所示:
使用:
我们还假设,在使用(*)
的结果的平等中,n
不是2^(2^j)
形式上的数字,对于某个正整数{{1} }。对于此假设不成立的j
值,只需移除上方n
总和中的floor function。
从上面可以看出,你的算法显然具有 log-logarithmic 时间复杂度,即(渐近上限)k
。