int x =0;
for (int i = 1; i < n; i++) {
for (int j = 1; j < n; ++j) {
x++;
n--;
}
}
我知道嵌套for循环的时间复杂度等于最里面的循环执行的次数。
像外部循环从1到n的每个嵌套循环一样,它应该运行n次,但这里我们有n--
,这使得算法运行的顺序更好。实际上,我在IDE中编写了这段代码,并在循环结束后打印了x的最终结果,对于不同的n值,我看到跳入内部for循环需要将近n倍的时间。
所以我认为这个算法的整个顺序是O(n)
,但我不确定
如果你只想要大O或大θ的时间复杂度,让我们只计算上界和下界,这是更容易的情况。
考虑inner for循环
,n
将在时间上减少一半,或者n
将在每次离开inner for循环
时变为n/2
(您已经知道,因为j
在时间上增加1个单位,n
在时间上减少1个单位,所以j
和n
将在中间n
或n/2
相遇)。当我们不知道代码何时停止时,事情就变得复杂了,n=?
,但我们知道n>1
考虑以下代码(上限):
int x =0;
for (;n > 1;) {
for (int j = 1; j < n; ++j) {
x++;
n--;
}
}
每次迭代n
将变成n/2
,直到n=1
,因此obove代码的复杂性将是n/2+n/4+n/8+...+1=O(n)
。
下限甚至更容易,假设内部for循环
只运行1次迭代,代码完成,1次迭代给出N/2
运算符。所以下限是O(n)
。
null null T(n)=O(1)+O(nlogn)=O(nlogn) 但我不确定。有人能帮帮我吗。
我正在尝试分析一个算法的时间复杂度。 下面的算法旨在只检查数组的一部分,所以如果它没有多大意义,请不要担心。 我对计算循环周围的时间复杂度很困惑,请看看我的评论。 这是否意味着我们有: T(N) = (C2 C4 C5)N (C1 C3 C6) T(N) = C7*N (C8) T(N)=N?? 循环中的所有内容都是*N? 先谢谢!
我如何发现它的时间和空间复杂性?
如何计算以下代码段的时间复杂度? 基本上,这段代码用于计算任何索引,计算数组的相邻索引有多少不小于。 我有点困惑在这种情况下如何计算时间复杂度。2个内部循环可能会在任何一点停止。 谢谢
我已经通过谷歌和堆栈溢出搜索,但我没有找到一个关于如何计算时间复杂度的清晰而直接的解释。 说代码像下面这样简单: 说一个像下面这样的循环: 这将只执行一次。 时间实际上被计算为而不是声明。