TLE问题-在Python中.index()方法慢吗



如果我是个新手,请原谅,我几周前才开始自学如何编码。

我一直在cses.fi上处理一组问题;收集数字";这个问题本质上问我们:给定一个数组,比如[4,2,1,5,3],我们必须";收集";使数字按从1到n的递增顺序组织的数字。

在这种特殊的情况下,我们将需要3轮,因为我们迭代一次并收集";1〃;,第二次迭代给了我们";2、3〃;,最后三分之一会给我们";4、5〃;。

我正在用Python编程,最终找到了解决方案,尽管我在提交时遇到了一个TLE错误。我做了一些调整,发现.method((大大减慢了我的代码速度。

TLE代码:

n = int(input())
arr = list(map(int, input().split()))
i_arr = [0] * (n + 1)
res = 1

for i in arr:
i_arr[i] = arr.index(i)
for i in range(1, len(i_arr)):
if i_arr[i] < i_arr[i - 1]:
res += 1

print(res)

运行时间为0.09s的已接受代码:

n = int(input())
arr = list(map(int, input().split()))
i_arr = [0] * (n + 1)
for i in range(n):
i_arr[arr[i]] = i
res = 1
for i in range(1, len(i_arr)):
if i_arr[i] < i_arr[i - 1]:
res += 1

print(res)

这两个代码块之间的唯一区别在于我在第一个for循环中的索引方式。

我的问题是:在python中,index方法慢吗?如果是,为什么?谢谢你的帮助。

是的,它会慢得多,尤其是随着'n'的大小增长。

在TLE代码中,您所说的是:

  • 通过在数组中搜索"i"来查找"i"的索引。请记住,python程序不能假设列表是有序的,所以它必须手动搜索第一个出现的"i">
  • 当"n"很小时,这很好,因为例如在第一次迭代中,.index((将首先查找i=0,然后快速返回,因为列表中的第一个数字恰好是0
  • 但想想看,随着n的增长,你基本上是在要求.index((遍历列表,每次增加1个点
  • 这个for循环就是所谓的O(n^2(算法,因为对于"n"中的每个"i",最坏的情况是搜索n个项以找到要返回的索引。更糟糕的情况发生在for循环的最后一次迭代中

您的第二个实现不需要像第一个实现那样遍历列表n次。

当然,正如我提到的,第一个实现不必每次都遍历整个列表,但随着循环的进行和"I"的增长,情况会变得更糟。

最新更新