[英]Time complexity of Python Function Involving List Operations
当我在 plot 为不同大小输入的以下算法所花费的时间时,时间复杂度似乎是多项式的。 我不确定是哪些操作导致了这一点。
我假设它与list(s)
, del l[i]
和l[::-1]
,但我不清楚这些单独的复杂性是什么。 谁能解释一下?
另外,有没有办法在不完全改变方法的情况下优化算法? (我知道有一种方法可以通过使用“双端钳形运动”将其降低到线性时间复杂度。)
def palindrome_index(s):
for i, c in enumerate(s):
l = list(s)
del l[i]
if l[::-1] == l:
return i
return -1
您的算法在len(s)
中确实是二次的:
在迭代i中,您在长度上执行线性时间操作:创建列表、反转它,以及(平均线性地)擦除元素i 。 由于您执行此len(s)
次,因此它在len(s)
中是二次的。
我假设它与列表、del l[i] 和 l[::-1] 有关,但我不清楚这些单独的复杂性是什么。 谁能解释一下?
这些操作中的每一个都是线性时间(至少平均而言,这足以分析您的算法)。 从可迭代的或通过反转现有列表来构造列表,在列表的长度上是线性的。 删除元素i至少需要大约n - i + 1次移动元素,因为每个元素都向后移动一次。
所有这些都是线性的“O(n)”:
list(s)
list(s)
从s
创建一个新列表。 为此,它必须通过s
中的所有元素 go ,因此其时间与s
的长度成正比。
l[::-1]
就像list(s)
一样, l[::-1]
创建一个新列表,其元素与l
相同,但顺序不同。 它必须接触每个元素一次,因此它的时间与l
的长度成正比。
del l[i]
In order to delete an element at position i
, the element which was at position i+1
has to be moved to position i
, then element which was at i+2
has to be moved to position i+1
etc. So, if you正在删除第一个元素( del l[0]
),它必须触摸移动列表的元素,如果您要删除最后一个元素( del l[-1]
),它只需要删除最后一个。 平均而言,它将移动n/2
元素,因此它也是线性的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.