Python-时间复杂度

本文记录了当前 CPython 中各种操作的时间复杂度(又名“Big O”或“大欧”)。其他Python实现(或CPython的旧版本或仍在开发版本)可能具有略微不同的性能特征。

列表(list)

以完全随机的列表考虑平均情况。

列表是以数组(Array)实现的; 最大的开销来自于超出当前分配大小(因为这种情况下, 所有元素都必须移动), 或者在开头附近的某处插入或删除(因为之后的所有元素都必须移动)。如果需要在两端添加/删除, 请考虑使用collections.deque。
在这里插入图片描述

双端队列(collections.deque)

deque(双端队列)是以双向链表的形式实现的。(好吧, 一个数组列表而不是对象, 以提高效率)。双端队列的两端都是可达的, 但从查找队列中间的元素较为缓慢, 增删元素就更慢了。
在这里插入图片描述

集合(set)

和字典非常相似, 可参考dict。
在这里插入图片描述

由源码得知, 求差集(s-t, 或s.difference(t))运算与更新为差集(s.difference_uptate(t))运算的时间复杂度并不相同!第一个是O(len(s))(对于s中的每个元素, 如果不在t中, 将它添加到新集合中)。第二个是O(len(t))(对于t中的每个元素, 将其从s中删除)。因此, 必须注意哪个是首选, 取决于哪一个是最长的集合以及是否需要新的集合。

集合的s-t运算中, s和t都要是set类型。如果t不是set类型, 但是是可迭代的, 你可以使用等价的方法达到目的, 比如 s.difference(l), l是个list类型。

字典(dict)

下列字典的平均情况基于以下假设:
1. 对象的散列函数足够撸棒(robust), 不会发生冲突。
2. 字典的键是从所有可能的键的集合中随机选择的。
小窍门:只使用字符串作为字典的键。这么做虽然不会影响算法的时间复杂度, 但会对常数项产生显著的影响, 这决定了你的一段程序能多快跑完。
在这里插入图片描述

Notes
这些操作依赖于“摊销最坏情况”的“摊销”部分。根据容器的历史, 个别动作可能需要很长时间。
对于这些操作, 最坏的情况n是容器达到的最大尺寸, 而不仅仅是当前的大小。例如, 如果一个N个元素的字典, 然后删除N-1个元素, 这个字典会重新为N个元素调整大小, 而不是当前的一个元素, 所以时间复杂度是O(n)。

转载自

https://zhuanlan.zhihu.com/p/64841133

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值