这个for循环的运行时间复杂度是多少
Posted
技术标签:
【中文标题】这个for循环的运行时间复杂度是多少【英文标题】:What is the running time complexity of this for loop 【发布时间】:2018-10-21 06:09:49 【问题描述】:for (int p = t; p > 0; p >>= 1)
for (int i = 0; i < n - p; ++i)
if ((i & p) != 0)
sort2(a, i, i+p);
for(int q = t; q > p; q >>= 1)
for(int i = 0; i < n- q; ++i)
if ((i & p) != 0)
sort2(a, i+p, i+q);
这里n
是某个正整数,t
大于n/2
,但不等于n
。
据我了解,内部 for 循环运行了 (n-p)
次,但我无法弄清楚外部 for 循环。
我试着找到它如下:
如果t=64
和n=100
,则取p
的二进制值,等于64
,所以p=1000000
base 2。
我了解每次减少一位数,在这种情况下总共执行 7 次。我不知何故无法弄清楚一般时间。
另外,我的理解是第三个 for 循环,即
for(int q = t; q > p; q >>= 1)
根本不执行,因为条件q>p
不满足p=q=t
。
这是正确的吗?我只是从算法开始。
【问题讨论】:
左大括号比右大括号多,缩进没有帮助。 什么是sort2
?
【参考方案1】:
为此:复杂度为BigO( log(t)(n-t)log(t) )
排除for
循环内的sort2
函数复杂度。
说明:
外循环复杂度为log(p)+1
[每次将位右移 1 并转到greater than 0
],因此对于 t = 64,循环将变为 [64, 32, 16, 8, 4、2、1]。
内循环复杂度将是greater of ( O(n-p), O((n-t)log(t)) )
执行
对于第二个内层循环嵌套了最外层循环的for循环:
【讨论】:
我的理解是还有一个 for 循环 for(int q = t; q > p; q >>= 1),所以,这个 for 循环是 (n-t)log(t) 和最终的外部 for 循环再次为 log(t),因此整体复杂度为 (n-t)(log(t))^2。请纠正我。 你有 2 个内部循环,这两个都没有嵌套,所以最后它们会被相加而不是相乘。 是的@Sree 你的权利,我还没有看到内部嵌套。我猜你已经编辑了你的代码。我已经改变了答案 不知道sort2
的复杂性怎么回答??
@Nityanarayan44:Nityanarayan44 先生,如果你观察得当的话,这段代码中有四个循环,所有循环的复杂度都取决于sort2
的复杂度。以上是关于这个for循环的运行时间复杂度是多少的主要内容,如果未能解决你的问题,请参考以下文章