Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么python的时间复杂性是';s list.append()方法O(1)?_Python_Python 2.7_Time Complexity_Amortized Analysis - Fatal编程技术网

为什么python的时间复杂性是';s list.append()方法O(1)?

为什么python的时间复杂性是';s list.append()方法O(1)?,python,python-2.7,time-complexity,amortized-analysis,Python,Python 2.7,Time Complexity,Amortized Analysis,如的文档所示,Python的list类型是使用数组实现的 因此,如果正在使用一个数组,并且我们进行了一些附加操作,那么最终您将不得不重新分配空间并将所有信息复制到新空间。 毕竟,这怎么可能是O(1)最坏的情况呢?如果您查看链接文档中的脚注,您会发现其中包含一条警告: 这些业务依赖于“摊销”部分的“摊销”部分 案例”。个人行动可能需要惊人的时间,这取决于 容器的历史记录 使用,即使我们必须偶尔执行昂贵的操作,当把它们看作序列,而不是单独地。 因此,任何单独的操作都可能非常昂贵——O(n)或O(n^

如的文档所示,Python的
list
类型是使用数组实现的

因此,如果正在使用一个数组,并且我们进行了一些附加操作,那么最终您将不得不重新分配空间并将所有信息复制到新空间。

毕竟,这怎么可能是O(1)最坏的情况呢?

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

这些业务依赖于“摊销”部分的“摊销”部分 案例”。个人行动可能需要惊人的时间,这取决于 容器的历史记录

使用,即使我们必须偶尔执行昂贵的操作,当把它们看作序列,而不是单独地。 因此,任何单独的操作都可能非常昂贵——O(n)或O(n^2)或更大的东西——但由于我们知道这些操作非常罕见,我们保证一系列的O(n)操作可以在O(n)时间内完成。

它是O(1)摊销,而不是O(1)

假设列表保留的大小是8个元素,当空间用完时,它的大小会加倍。你想推50个元素

前8个元件推入O(1)。 第九次触发重新分配和8个拷贝,然后是O(1)推送。 下一个7推入O(1)。 第十七个触发重新分配和16个拷贝,然后是O(1)推送。 下一个15推入O(1)。 第三十三个触发重新分配和32个拷贝,然后是O(1)推送。 下一个17推入O(1)

所有的推送都有O(1)复杂度,在O(1)处有56个拷贝,在O(n)处有3个重新分配,n=8、16和32。请注意,这是一个几何级数,渐近等于O(n),n=列表的最终大小。这意味着将n个对象推到列表上的整个操作是O(n)。如果我们按元素摊销,它是O(n)/n=O(1)。

这很容易

我们可以通过将n个元素添加到arraylist中的总时间累加并除以n来计算

首先,我们需要重新定位log(n)次,每次重新定位都是2的两倍。因此我们有一个比例级数,其比率为2,长度为log(n)

比例级数的和是a(1-r^n)/(1-r) 因此,迁移的总时间为(1-n)/(1-2)=n
时间复杂度将是n/n=1。

我理解您在这里链接的内容,但这意味着“摊销最坏情况”实际上是“摊销平均情况”,因为如果假设每n个追加,您需要进行一次大的分配+复制,这意味着您对追加进行了o(1)的平均,而您的最坏情况是o(n)否,摊销平均数和摊销最坏情况之间存在差异。摊销平均情况是序列的平均运行时间除以序列中的操作数。摊销最坏情况是序列的最坏可能运行时间除以序列中的操作数。(你可以看到“平均值”是以两种不同的方式使用的,这有点令人困惑。)摊销成本与每个单独操作的成本是不同的,它可以更低——关键是通过“平均”序列,你可以得到一个更有用的界限。