考虑以下伪代码。它有一个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)
答案 0 :(得分:2)
比这更复杂,但不一定是因为条件限制。您当前的代码在每个分支中都是相同的,虽然您的真实代码可能看起来不完全相同,但它可能是一个很好的近似值。在这种情况下,困难完全来自其他地方。
当前代码的复杂性是所有子列表中所有元素长度的总和。如果n
是myList
,sublist
和element
长度的上限,那么这是O(n³),否则可能会变得复杂。< / p>
另一个简单的特例是:
myList
的长度为n
。sublist
的长度最多为m
。element
的长度最多为k
。然后您的复杂性将为O(nmk),假设n
,m
和k
为正。
答案 1 :(得分:0)
我认为你假设n
是列表myList
的长度(子列表的数量),那么你的函数的时间复杂度不仅取决于列表的长度{{1} },但也取决于:
每个子列表的最大长度(每个子列表中的最大元素数 - 每个分支条件的第二个myList
)
每个元素的最大长度(每个元素中的字符数 - 第3个for-loop
)
准确地说,如果for-loop
,n
,m
分别是列表的长度,每个子列表的最大长度以及每个元素的最大长度,那么时间复杂度为在最坏的情况下,你的算法是O(n * m * p)。
答案 2 :(得分:0)
此代码的复杂性实际上是O(1)
。关于哪个条件成立,以及列表,子列表和元素的长度是多少 - 您在阅读第一个字符后立即返回。
如果这是一个错误,而你实际上正在迭代所有字符,那将取决于n
,并且有两种常用方法来定义它:
O(n)
。来自wikipedia:Run-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**....
n
称为mylist
中的子列表数量,而不是输入的大小,并且除此外,每个子列表都有m
个元素,每个元素的长度为{{ 1}}(平均所有)。然后,复杂性为k