Algorithm 两个代码片段的大O表示法
我有两段代码,并解释了它们属于哪个大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
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;isum 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
我们知道1m
次之和等于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支持的情况下,试图澄清推理。