我正在学习有关Big-O的知识,尽管我开始了解事物,但仍然无法正确地衡量算法的Big-O。 我有一个代码:
int n = 10;
int count = 0;
int k = 0;
for (int i = 1; i < n; i++)
{
for (int p = 200; p > 2*i; p--)
{
int j = i;
while (j < n)
{
do
{
count++;
k = count * j;
} while (k > j);
j++;
}
}
}
我必须测量Big-O和Exact Runtime。
让我开始吧,第一个for
循环是O(n)
,因为它取决于n
变量。
第二个for
循环是嵌套的,因此使big-O成为O(n^2)
。
那么我们如何计算while (j < n)
(到目前为止只有3个循环)以及如何计算do while(k > j)
(如果出现)会产生4个循环,例如在这种情况下?
理解的解释将非常有帮助。
谢谢。
答案 0 :(得分:4)
除非我犯了很多错误,否则该程序具有无限循环,因此无法分析其时间复杂性。 特别是
do
{
count++;
k = count * j;
} while (k > j);
第二次进入此循环后,count = 2
,k
将被设置为更大的j
,并且将无限期保持(忽略整数溢出,这种情况会发生很快)。
我了解您正在学习Big-Oh符号,但是创建这样的玩具示例可能不是理解Big-Oh的最佳方法。我建议阅读一本著名的算法教科书,他们将带您了解新算法,并在此过程中解释和分析时间和空间的复杂性。
答案 1 :(得分:0)
我假设while循环应该是:
while (k < j)
现在,在这种情况下,第一个for循环将花费O(n)时间。第二个循环将花费O(p)时间。 现在,对于第三个循环,
int j = i;`
while (j < n){
...
j++;
}
可以改写为
for(j=i;j<n;j++)
表示将花费O(n)时间。 对于最后一个循环,k的值呈指数增加。 认为与
相同for(k = count*j ;k<j ;j++,count++)
因此,这将需要O(logn)时间。
总时间复杂度为O(n ^ 2 * p * logn)。