我是数据结构课程的新手,在我以前的CS课程中只略微触及了Big-O的主题。我仍然在网上学习它,但我只是想确保我这样做。关于Big-O分析有一些功课问题,我只是想和你们一起仔细检查。
以下是让我感到困惑的一些问题,以及我所做的分析:
//Part (a)
int x = 0;
for(int i = n; i >= 0; i--) //N times
if((i % 3) == 0) break; //Executed O(N) times
else x += n; //Executed O(N) times
Analysis: O(n)
//Part (b)
int x = 0;
for(int i = 0; i < n; i++) //N times
for(int j = 0; j < (n * n /3); j++) //N^2 times
x += j; //Executed O(N^3) times
Analysis: O(N^3)
//Part (c)
int x = 0;
for(int i = 0; i <= n; i++) //N times
for(int j = 0; j < (i * i); j++) //N^2 times
x += j; //Executed O(N^3) times
Analysis: O(N^3)
我很抱歉,如果我的分析错误或者到处都是,我仍然对这个概念不熟悉!任何输入和/或解释将不胜感激。谢谢!
答案 0 :(得分:3)
部分a:循环最多执行三次。三是恒定的上限,因此复杂性是恒定的(aka O(1)
)。
b部分:你对此是正确的。
c部分:在脑海中执行此循环,并根据x += j
的值考虑i
运行的次数。如果i
为零,则内循环将运行0次,如果i
为1,则内循环将运行1次 - 通常,内循环将运行i^2
(我平方时间。当我们计算整个事物(包括外部循环)时,x += j
行将运行的总次数为:
0 2 + 1 2 + 2 2 + 3 2 + ... +(n - 1) 2 + n 2
此数学表达式等于(1/6)n(n + 1)(2n + 1)
(see here),O((1/6)n(n + 1)(2n + 1))
等于O(n^3)
。所以你得到了正确答案,但错误的方法。