Algorithm 两个代码片段的大O表示法

Algorithm 两个代码片段的大O表示法,algorithm,big-o,Algorithm,Big O,我有两段代码,并解释了它们属于哪个大O类。然而,尽管我可能会尝试,但我无法将解释与我通过查看或进行样本运行得出的结果相吻合 第一: long count = 0; long n = 1000; long i, j, k; for(i = 0; i < n; i++) for (j = 0; j < i * i; j++) for (k = 0; k < j; k++) count++; lo

我有两段代码,并解释了它们属于哪个大O类。然而,尽管我可能会尝试,但我无法将解释与我通过查看或进行样本运行得出的结果相吻合

第一:

long count = 0;
long n = 1000;
long i, j, k;
    for(i = 0; i < n; i++) 
        for (j = 0; j < i * i; j++) 
            for (k = 0; k < j; k++) 
                count++;
long count=0;
长n=1000;
长i,j,k;
对于(i=0;i
这个例子一直给我N^4,但我得到的答案是“j可以和I^2一样大,也可以和N^2一样大。k可以和j一样大,也就是N^2。因此,运行时间与N^N^2^N^2成正比,也就是O(N^5)”

第二段:

long i, j, k;
long n = 1000;
long count = 0;
for (i = 1; i < n; i++)
    for (j = 1; j < i * i; j++)
        if (j % i == 0)
            for (k = 0; k < j; k++)
                count++;
<代码>长i、j、k; 长n=1000; 长计数=0; 对于(i=1;i 对于这一点,注释中说“if语句最多执行N3次,根据前面的参数,但它仅为O(N^2)次(因为对于每个i,它正好为i次)。因此,最里面的循环仅执行O(N^2)次。每次通过,它需要O(j^2)=O(N^2)次,总共O(N^4)”

对于这一点,注释对于N^4似乎足够准确(尽管我一直得到N^4/10的结果)。我不遵循模计算,只是每个I的I次为真,然而,它似乎很少进入这个循环

所以问题是谁能澄清我不理解的地方

对于第一个:

sum from i = 0 to n-1 of
    sum from j = 0 to i*i-1 of
        sum from k = 0 to j-1 of
            1
我们知道1
m
次之和等于
m
,因此我们可以将其减少到

sum from i = 0 to n-1 of
    sum from j = 0 to i*i-1 of
        j
我们知道和
1+2+…+m=m*(m+1)/2
,因此我们可以进一步减少:

sum from i = 1 to n-1 of
    (i * i - 1) * i * i / 2 = (1/2) * (i * i * i * i - i * i)
我们可以通过将
(1/2)
置于总和之外,然后将
i*i*i*i
i*i
项分开来简化这一过程;然而,与单独的
i
相比,求和更难,更不为人所知。它确实是θ(n^5)
,因此
O(n^5)
;至少要有一个直观的感觉来解释为什么会这样,要认识到差异
f(n+1)-f(n)=(1/2)(n^4-n^2)
的顺序是
n^4
,所以如果
f
是一个连续函数,而这个差异是导数,那么
f
的顺序会更高

对于第二种情况:

sum from i = 0 to n-1 of
    sum from j = 0 to i-1 of
        sum from k = 0 to i*j-1
            1
请注意,
j
现在只假定
i
不同的值,用于最内部的循环:
0,i,2i,…(i-1)i
。内部循环运行的迭代次数是
j
的计数器值的i倍。我们做乘法移位是为了避免引入“步”符号,这样我们就可以使用我们通常的数学结果

sum from i = 0 to n-1 of
    sum from j = 0 to i-1 of
        i*j

sum from i = 0 to n-1 of
    i * (1/2) * i * (i - 1) = (1/2)(i * i * i - i)

同样,我们可以作弊或者做数学运算,或者我们可以再次(正确地)利用我们的直觉推测这是
Theta(n^4)

“我一直得到
n^4/10
”的结果-大O忽略了乘法常数。你明白第一个吗,或者你也需要一个解释?回答得很好,谢谢。出于我自己的兴趣,你写答案的方式是,对于有助于这种推理的东西的输入?@Saf这是我刚刚(可能重新)发明的一种特殊符号,目的是在这个SE站点上没有MathJax/LaTeX支持的情况下,试图澄清推理。