我正在研究各种解决方案的时间复杂性,因为我不是一个数学爱好者;我无法弄清楚我的电话的最佳时间复杂性。
问题在于我不确定是否需要更长时间才能通过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循环必须检查多个语句时会发生什么。
答案 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
似乎是一个自变量,所以我们应该可以忽略它。如果x
是True
,那么你的时间复杂度是无穷大的,因为while循环永远不会结束(至少直到整数a
溢出到负数。注意这意味着你的语句“while循环有复杂度O(n)“也是错误的”。如果x
为False
,则您的代码的时间复杂度为O(a-1)
(或简称为O(a)
),因为它将通过a-1
次迭代运行。