涉及列表操作的Python函数的时间复杂性
当我为不同大小的输入绘制以下算法所花费的时间时,时间复杂度似乎是多项式。我不确定是哪种操作导致了这种情况 我假设这与列表有关,dell[I]和l[::-1],但我不清楚它们各自的复杂性。谁能解释一下吗 还有,有没有一种方法可以在不完全改变方法的情况下优化算法?我知道有一种方法可以通过使用双端钳形运动将其降低到线性时间复杂度涉及列表操作的Python函数的时间复杂性,python,time-complexity,Python,Time Complexity,当我为不同大小的输入绘制以下算法所花费的时间时,时间复杂度似乎是多项式。我不确定是哪种操作导致了这种情况 我假设这与列表有关,dell[I]和l[::-1],但我不清楚它们各自的复杂性。谁能解释一下吗 还有,有没有一种方法可以在不完全改变方法的情况下优化算法?我知道有一种方法可以通过使用双端钳形运动将其降低到线性时间复杂度 def palindrome_index(s): for i, c in enumerate(s): l = list(s) del
def palindrome_index(s):
for i, c in enumerate(s):
l = list(s)
del l[i]
if l[::-1] == l:
return i
return -1
您的算法在镜头中确实是二次的: 在迭代i中,您在长度上执行线性时间操作:创建列表、反转列表,以及在线性平均上擦除元素i。由于执行此镜头次数,因此它在镜头中是二次的 我假设这与列表有关,dell[I]和l[::-1],但我不清楚它们各自的复杂性。谁能解释一下吗
这些操作中的每一个都是线性时间,至少平均而言,这足以分析您的算法。从iterable或通过反转现有列表来构造列表在列表长度上是线性的。删除元素i至少需要元素的n-i+1个移位,因为每个元素向后移动一次。所有这些都是线性的:
list(s)
列表从s创建一个新列表。要做到这一点,它必须通过s中的所有元素,所以它的时间与s的长度成正比
与列表一样,l[::-1]创建一个新列表,其中的元素与l相同,但顺序不同。它必须接触每个元素一次,因此其时间与l的长度成正比
为了删除位置i处的元素,必须将位置i+1处的元素移动到位置i,然后将位置i+2处的元素移动到位置i+1等。因此,如果要删除第一个元素del l[0],它必须触摸列表中的移动元素,如果要删除最后一个del l[-1],它只需要删除最后一个。平均而言,它将移动n/2个元素,因此它也是线性的。您想要实现什么?从外观上看,如果从输入字符串中删除一个字符,则检查输入字符串是否变为回文,然后返回删除字符的索引…
l[::-1]
del l[i]