使用if / elif / else语句的函数的O(n ^ 3)复杂度

时间:2016-08-14 16:41:05

标签: time-complexity

考虑以下伪代码。它有一个if / else / if语句。在每个条件分支中,有一个三重嵌套的for循环。这个语句的复杂性是O(n ^ 3),因为函数只能采用一个路径(即if,elif或者其他),还是比它更复杂?

def myFunction(myVariable, myList):
    if myList == conditionOne:
        for sublist in myList:
            for element in sublist:
                for char in element:
                    print(char)
    elif myList == conditionTwo:
        for sublist in myList:
            for element in sublist:
                for char in element:
                    print(char)
    else:
        for sublist in myList:
            for element in sublist:
                for char in element:
                    print(char)

3 个答案:

答案 0 :(得分:2)

比这更复杂,但不一定是因为条件限制。您当前的代码在每个分支中都是相同的,虽然您的真实代码可能看起来不完全相同,但它可能是一个很好的近似值。在这种情况下,困难完全来自其他地方。

当前代码的复杂性是所有子列表中所有元素长度的总和。如果nmyListsublistelement长度的上限,那么这是O(n³),否则可能会变得复杂。< / p>

另一个简单的特例是:

  • myList的长度为n
  • 每个sublist的长度最多为m
  • 每个element的长度最多为k

然后您的复杂性将为O(nmk),假设nmk为正。

答案 1 :(得分:0)

我认为你假设n是列表myList的长度(子列表的数量),那么你的函数的时间复杂度不仅取决于列表的长度{{1} },但也取决于:

  • 每个子列表的最大长度(每个子列表中的最大元素数 - 每个分支条件的第二个myList

  • 每个元素的最大长度(每个元素中的字符数 - 第3个for-loop

准确地说,如果for-loopnm分别是列表的长度,每个子列表的最大长度以及每个元素的最大长度,那么时间复杂度为在最坏的情况下,你的算法是O(n * m * p)。

答案 2 :(得分:0)

此代码的复杂性实际上是O(1)。关于哪个条件成立,以及列表,子列表和元素的长度是多少 - 您在阅读第一个字符后立即返回。

如果这是一个错误,而你实际上正在迭代所有字符,那将取决于n,并且有两种常用方法来定义它:

  1. 通常在谈论时间复杂性时,我们会根据输入进行定义。在这里,您的算法(假设迭代所有元素)在输入的大小上是线性的,因此复杂度实际上是O(n)。来自wikipediaRun-time analysis is a theoretical classification that estimates and anticipates the increase in running time (or run-time) of an algorithm as its **input size (usually denoted as n) increases**....
  2. 如果您将n称为mylist中的子列表数量,而不是输入的大小,并且除此外,每个子列表都有m个元素,每个元素的长度为{{ 1}}(平均所有)。然后,复杂性为k