嵌套if的时间复杂度,与while中的多个case相比

时间:2016-01-02 06:31:48

标签: python time-complexity

我正在研究各种解决方案的时间复杂性,因为我不是一个数学爱好者;我无法弄清楚我的电话的最佳时间复杂性。

问题在于我不确定是否需要更长时间才能通过1个语句进行while循环,并嵌套if-else,或者如果最好删除嵌套的if-else并添加check in in while循环。

作为通用示例,这会更快地执行

while a>1 and b is True
    if x is True:
        a -= 1
    else
        a += 1

而不是

while a>1:
    if x is True:
        if  b is True:
            a -= 1
        else:
            a += 1

我记得嵌套的结果是O(N ^ 2),而简单的while循环有复杂度O(n),但是当while循环必须检查多个语句时会发生什么。

2 个答案:

答案 0 :(得分:0)

两者都具有O(n)的复杂性,n与while循环迭代相关。如果else语句不改变这个。试想一下:当你的输入变量变为无穷大时,你的迭代计数如何扩展?线性? Cubicly?或者呢?

例如,检查此伪代码:

for(x time)
    for(y time)
        for(z time)
            do ....
            if(z=x+y)

我们有3次嵌套循环。因此复杂度为O(x * y * z),其简单为O(n ^ 3)。你不关心条件,因为当变量变为无穷大时,不会缩放迭代计数。

在决定复杂性时,通常应检查嵌套循环并检查哪些变量对于迭代计数是重要的。

我还建议您阅读:https://www.cs.cmu.edu/~adamchik/15-121/lectures/Algorithmic%20Complexity/complexity.html

毕竟这是一个深刻的话题。

答案 1 :(得分:0)

  

我记得嵌套的结果是O(N ^ 2)

错误的是,嵌套for循环的复杂度为O(N^2)而不是if

如果您有一个大小为N的数组,那么

for i in arr:
    for j in arr:
        print "hello"

你会看到多少次打印“你好”? N ^ 2,这是复杂性。

请注意,在循环中执行的操作无关紧要(无论是打印,添加,执行if语句),这都是固定成本。因此,您重新安排if语句的事实并不重要 - 两种情况都具有完全相同的复杂性。

重要的是你的while循环中代码“body”的执行频率,这就决定了复杂性。

所以,让我们因为你的两个例子具有相同的复杂性,让我们分解第一个:

while a>1 and b is True
    if x is True:
        a -= 1
    else
        a += 1

b似乎是一个自变量,所以我们应该可以忽略它。如果xTrue,那么你的时间复杂度是无穷大的,因为while循环永远不会结束(至少直到整数a溢出到负数。注意这意味着你的语句“while循环有复杂度O(n)“也是错误的”。如果xFalse,则您的代码的时间复杂度为O(a-1)(或简称为O(a)),因为它将通过a-1次迭代运行。