最近刷数据结构和算法题,有些方法自己实现非常繁琐,用内置方法不知道时间复杂度,这篇blog供查询,实际上常用的也就那么几个
本文中,’n’代表容器中元素的数量,’k’代表参数的值,或者参数的数量。
列表(list)
以完全随机的列表考虑平均情况。
列表是以数组(Array)实现的。最大的开销发生在超过当前分配大小的增长,这种情况下所有元素都需要移动;或者是在起始位置附近插入或者删除元素,这种情况下所有在该位置后面的元素都需要移动。如果你需要在一个队列的两端进行增删的操作,应当使用collections.deque(双向队列)
双向队列(collections.deque)
deque(双端队列)是以双向链表的形式实现的。双端队列的两端都是可达的, 但从队列查找中间的元素较为缓慢,。
集合(set)
未列出的操作可参考 dict —— 二者的实现非常相似。
由源码得知,求差集(s-t,或s.difference(t))运算与更新为差集(s.difference_uptate(t))运算的时间复杂度并不相同!前者是将在s中,但不在t中的元素添加到新的集合中,因此时间复杂度为O(len(s));后者是将在t中的元素从s中移除,因此时间复杂度为O(len(t))。因此,使用时请留心,根据两个集合的大小以及是否需要新集合来选择合适的方法。
字典(dict)
下列字典的平均情况基于以下假设:
- 对象的散列函数足够撸棒(robust),不会发生冲突。
- 字典的键是从所有可能的键的集合中随机选择的。
小窍门:只使用字符串作为字典的键。这么做虽然不会影响算法的时间复杂度,但会对常数项产生显著的影响,这决定了你的一段程序能多快跑完。