0
点赞
收藏
分享

微信扫一扫

Python内置方法的时间复杂度

最近刷数据结构和算法题,有些方法自己实现非常繁琐,用内置方法不知道时间复杂度,这篇blog供查询,实际上常用的也就那么几个

本文中,’n’代表容器中元素的数量,’k’代表参数的值,或者参数的数量。

列表(list)

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

列表是以数组(Array)实现的。最大的开销发生在超过当前分配大小的增长,这种情况下所有元素都需要移动;或者是在起始位置附近插入或者删除元素,这种情况下所有在该位置后面的元素都需要移动。如果你需要在一个队列的两端进行增删的操作,应当使用collections.deque(双向队列)
Python内置方法的时间复杂度_散列表

双向队列(collections.deque)

deque(双端队列)是以双向链表的形式实现的。双端队列的两端都是可达的, 但从队列查找中间的元素较为缓慢,。
Python内置方法的时间复杂度_leetcode_02

集合(set)

未列出的操作可参考 dict —— 二者的实现非常相似。
Python内置方法的时间复杂度_时间复杂度_03
由源码得知,求差集(s-t,或s.difference(t))运算与更新为差集(s.difference_uptate(t))运算的时间复杂度并不相同!前者是将在s中,但不在t中的元素添加到新的集合中,因此时间复杂度为O(len(s));后者是将在t中的元素从s中移除,因此时间复杂度为O(len(t))。因此,使用时请留心,根据两个集合的大小以及是否需要新集合来选择合适的方法。

字典(dict)

下列字典的平均情况基于以下假设:

  1. 对象的散列函数足够撸棒(robust),不会发生冲突。
  2. 字典的键是从所有可能的键的集合中随机选择的。

小窍门:只使用字符串作为字典的键。这么做虽然不会影响算法的时间复杂度,但会对常数项产生显著的影响,这决定了你的一段程序能多快跑完。
Python内置方法的时间复杂度_链表_04


举报

相关推荐

0 条评论