当前位置: 首页 > 面试题库 >

为什么python的list.append()方法的时间复杂度为O(1)?

巫马善
2023-03-14
问题内容

从TimeComplexity文档中可以看出,Python的list类型是使用数组实现的。

因此,如果正在使用数组并且进行了一些附加操作,最终您将不得不重新分配空间并将所有信息复制到新空间。
毕竟,这是O(1)最坏的情况吗?


问题答案:

如果查看链接文档中的脚注,您会发现它们包含一个警告:

这些操作依赖于“最坏情况摊销”的“摊销”部分。根据容器的历史记录,各个动作可能会花费惊人的时间。

使用摊销分析,即使我们偶尔需要执行昂贵的操作,当您将其视为序列而不是单独进行操作时,我们也可以降低“平均”操作成本。

因此,任何单个操作都可能非常昂贵-O(n)或O(n ^ 2)或更大的值-但由于我们知道这些操作很少见,因此我们保证可以在内部执行一系列O(n)操作准时。



 类似资料:
  • 我不明白堆排序的空间复杂度是怎样的O(1)?虽然快速排序不使用任何额外的数组(即就地),但在最坏情况下其空间复杂度为O(n),在最佳情况下为O(lg n),因为在递归调用的后端使用堆栈。我说得对吗? 堆排序也是如此。虽然,它是就地的,但是由于Build-Heap函数调用Max-Heapify函数,所以它的空间复杂度应该等于Max-Heapify,即O(lg n)。不是吗?此外,稍后在根节点调用Ma

  • 问题内容: 我打算对StringBuilders中的最后一个字符进行很多删除。使用的解决方案对我来说很好。但是,由于这些删除将处于循环中,因此我需要知道其复杂性。 据我了解,该操作只是减少了StringBuilder对象的一些私有属性,并且不对字符本身执行任何复制/克隆/复制操作,因此它的时间为O(1),应该可以快速运行。 我对吗? 问题答案: 从文档中: 设置字符序列的长度。序列更改为新的字符序

  • 问题内容: 我刚刚开始学习数据结构,并且在进行数组插入时想知道为什么数组插入的时间复杂度为O(n)而不是O(n + 1)? 在最佳情况下,当插入在最后时,时间复杂度为O(1)。我想我们正在考虑1插入元素,因为这里没有元素被移动。在最坏的情况下,假设我们必须移动n个元素然后插入新元素,那么时间时间复杂度是否应该为O(n + 1)?n用于移动元素,1用于插入。 非常感谢您的帮助。 问题答案: O(n)

  • 有一个循环执行蛮力算法来计算5*3,而不使用算术运算符。 我只需要加5 3次,这样它就需要O(3),如果输入是x*y,它就是O(y)。但是,在一本书中,它说它需要O(2^n),其中n是输入中的位数。我不明白为什么它用O(2^n)来表示它O(y)。这是显示时间复杂度的更好方法吗?。你能解释一下吗? 我没有要求其他算法来计算这个。

  • 给定一个整数数组arr,计算元素x,使得x 1也在arr中。如果arr中有重复项,请分别计数。 示例1:输入:arr=[1,2,3]输出:2说明:1和2被计数,因为2和3在arr中。 示例2:输入:arr=[1,1,2]输出:2解释:1计数两次,原因2在arr中。 示例3:输入:arr=[1,1,3,3,5,5,7,7]输出:0说明:没有计算数字,因为arr中没有2、4、6或8。 示例4:输入:a

  • 算法相对较新,所以如果我遗漏了一些显而易见的东西,请原谅! 我知道深度优先搜索的空间复杂度通常表示为O(h),其中h是树的高度,而广度优先搜索的复杂度是O(n),其中n是树中节点的数量。 我理解解释(例如在这个答案中https://stackoverflow.com/a/9844323/10083571)也就是说,在BFS中最坏的情况下,所有节点都在一个级别上,这意味着我们必须在遍历它们之前将所有