Python中集合的pop()的时间复杂度是多少?

Python中集合的pop()的时间复杂度是多少?,python,Python,我知道列表的最后一个元素是O(1)。 读了这篇文章之后 我注意到,如果我们从一个列表中弹出一个任意的数字,需要O(n),因为所有指针都需要向上移动一个位置 但是对于集合,没有顺序和索引。所以我不确定集合中是否还有指针 如果不是,set的pop()是否为O(1) 谢谢。在现代CPython实现中,pop需要摊销的常量ish时间(我将进一步解释)。在Python2上,它通常是相同的,但在某些情况下性能会严重下降 Pythonset基于哈希表,并且pop必须在表中找到一个被占用的条目才能删除并返回。

我知道列表的最后一个元素是O(1)。 读了这篇文章之后

我注意到,如果我们从一个列表中弹出一个任意的数字,需要O(n),因为所有指针都需要向上移动一个位置

但是对于集合,没有顺序和索引。所以我不确定集合中是否还有指针

如果不是,set的pop()是否为O(1)


谢谢。

在现代CPython实现中,
pop
需要摊销的常量ish时间(我将进一步解释)。在Python2上,它通常是相同的,但在某些情况下性能会严重下降

Python
set
基于哈希表,并且
pop
必须在表中找到一个被占用的条目才能删除并返回。如果每次都从表的开头开始搜索,则所需的时间将与空前导项的数量成比例,并且每次
pop
,搜索速度会变慢

为了避免这种情况,标准CPython实现尝试记住最后一个
pop
ped条目的位置,以加快
pop
s的顺序。CPython 3.5+在设置内存布局中有一个专用的存储位置,但滥用第一个哈希表项的哈希字段来存储此索引


在任何Python版本中,通过一系列
pop
操作从集合中删除所有元素都需要与基础哈希表的大小成比例的时间,该哈希表的大小通常在原始元素数的一个小常数因子内(除非您已经删除了一组元素)。如果插入的元素落在哈希表索引0中,则在Python2上混合插入和
pop
会严重影响这一点,从而破坏搜索结果。这在Python3上的问题要小得多。

在现代的CPython实现中,
pop
需要摊销的常量ish时间(我将进一步解释)。在Python2上,它通常是相同的,但在某些情况下性能会严重下降

Python
set
基于哈希表,并且
pop
必须在表中找到一个被占用的条目才能删除并返回。如果每次都从表的开头开始搜索,则所需的时间将与空前导项的数量成比例,并且每次
pop
,搜索速度会变慢

为了避免这种情况,标准CPython实现尝试记住最后一个
pop
ped条目的位置,以加快
pop
s的顺序。CPython 3.5+在设置内存布局中有一个专用的存储位置,但滥用第一个哈希表项的哈希字段来存储此索引


在任何Python版本中,通过一系列
pop
操作从集合中删除所有元素都需要与基础哈希表的大小成比例的时间,该哈希表的大小通常在原始元素数的一个小常数因子内(除非您已经删除了一组元素)。如果插入的元素落在哈希表索引0中,则在Python2上混合插入和
pop
会严重影响这一点,从而破坏搜索结果。这在Python3上不是什么问题。

Unduping。这个复制目标并没有处理
pop
(它具有惊人的时间复杂度特征)。当您在弹出表单集上运行计时测试时发生了什么?你对你的结果有什么困惑?解开衣服。这个复制目标并没有处理
pop
(它具有惊人的时间复杂度特征)。当您在弹出表单集上运行计时测试时发生了什么?你对你的结果有什么困惑?