【问题标题】:runtime of using [::-1] on a list [closed]在列表上使用 [::-1] 的运行时 [关闭]
【发布时间】:2022-01-25 15:40:24
【问题描述】:

准备面试,这是我找不到的。 https://blog.finxter.com/python-list-reverse/#:~:text=The%20time%20complexity%20of%20the,the%20number%20of%20list%20elements。说 .reverse() 是 O(n) 我认为是因为它替换了每个索引。是 [::-1] 只是向后打印列表还是发生了类似的事情

【问题讨论】:

  • “替换所有索引”是什么意思?我可能已经这样做太久了,但我无法想象你会如何在 not O(n) 中做到这一点,所以我不清楚你在问什么跨度>
  • “是 [::-1] 只是向后打印列表”—不,[::1] 没有打印任何内容:它正在向后切分列表以创建新列表。
  • 我的问题是如果使用 [::-1] 是内存中的同一个列表,只是从末尾读取到前面。如果 [::-1] 返回一个副本,那么它是一个 O(n) 操作,但是如果只是在内存中返回具有不同参考点的相同数组,那么就没有像 .reverse() 那样对数组进行操作 where数组的元素相互替换

标签: python time-complexity big-o


【解决方案1】:

list.reverse 在原地运行。这意味着它几乎肯定会在幕后做这样的事情:

for i in range(len(self) // 2):
     j = len(self) - 1 - i
     self[i], self[j] = self[j], self[i]

实际的方法是用C实现的,所以当然会比较冗长,尤其是交换操作。

list[::-1] 创建原始副本。这个想法是相似的,但是由于 not in place 的反转,您可以奢侈地只写入目标索引而不是通过临时对象进行交换:

new = [None] * len(self)
for i in range(len(self)):
    j = len(self) - 1 - i
    new[j] = self[i]

实际的切片处理代码要复杂得多,因为它必须能够接受整数和各种设置自定义开始和停止边界以及步长的非正统切片表达式。

【讨论】:

  • 欣赏它。你的回复帮助我意识到我真正想弄清楚的是什么。如果 [::-1] 是同一个数组或副本
  • @wetmoney。我建议选择一个答案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-01
  • 2013-12-15
相关资源
最近更新 更多