Big o 简单循环的大O表示法

Big o 简单循环的大O表示法,big-o,Big O,我刚开始学习数据结构课程,讲师们发布了10个问题,并询问其中一个问题的大O。根据我读到的文章,我假设这段代码的大O是O(1),因为数据参数是单个数据元素。但是,它确实会执行多次,这取决于数字的大小,所以这会使它成为O(N)吗 公共类主{ 公共静态void main(字符串[]args){ f(100 000); } 公共静态长f(int n){ 长和=0; 对于(长i=2;i

我刚开始学习数据结构课程,讲师们发布了10个问题,并询问其中一个问题的大O。根据我读到的文章,我假设这段代码的大O是O(1),因为数据参数是单个数据元素。但是,它确实会执行多次,这取决于数字的大小,所以这会使它成为O(N)吗

公共类主{
公共静态void main(字符串[]args){
f(100 000);
}
公共静态长f(int n){
长和=0;
对于(长i=2;i
此函数的时间复杂度为O(log(log(n))


i
通过指数增长因子的乘法增长,因此这是“双指数增长”(不确定这是否是一个有效的定义),复杂性是相反的。您可以阅读更多关于这类复杂性的信息。

此函数的时间复杂性为O(log(log(n))

i
通过指数增长因子的乘法增长,因此这是“双指数增长”(不确定这是否是一个有效的定义),复杂性是相反的。您可以阅读更多关于这类复杂性的信息。

使用西格玛表示法分析您的算法 要严格分析算法的增长,可以使用如下西格玛表示法:

与:

我们还假设,在等式中使用
(*)
的结果,
n
不是形式为
2^(2^j)
的数字,对于一些正整数
j
。对于
n
的值,如果这个假设不成立,只需去掉上面
k
的和中的


结果:对数对数时间复杂度 从上面可以明显看出,您的算法具有对数时间复杂度,即(渐近上界)
O(log(logn))

使用西格玛符号分析您的算法 要严格分析算法的增长,可以使用如下西格玛表示法:

与:

我们还假设,在等式中使用
(*)
的结果,
n
不是形式为
2^(2^j)
的数字,对于一些正整数
j
。对于
n
的值,如果这个假设不成立,只需去掉上面
k
的和中的


结果:对数对数时间复杂度
从上面可以明显看出,您的算法具有对数时间复杂度,即(渐近上界)
O(log(logn))

看看表达式
i=i*i
,它应该会给您一个线索。[提示]:思考将
i
计数器平方对复杂性的影响,即循环迭代次数与
N
的关系如何。打印
i
而不是
sum
,以了解此函数如何在表达式
i=i*i
处运行,该表达式应为您提供线索。[提示]:考虑一下对
i
计数器进行平方运算对复杂性的影响,即循环迭代次数与
N
的关系如何。打印
i
而不是
sum
,以了解这是如何播放的感谢解释和链接。不幸的是,我没有足够的分数来投票给answ呃,我认为答案有用。@Vaughnjavier不必担心,如果其他人觉得这有帮助,他们可以投票。谢谢你的解释和链接。不幸的是,我没有足够的分数来投票认为答案有用。@Vaughnjavier不必担心,如果其他人觉得这有帮助,他们可以投票。
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
}