Python常见操作的时间复杂度

Python常见操作的时间复杂度

本文整理了Python中常见数据结构操作的时间复杂度,旨在帮助大家了解Python操作的性能,协助大家写出更快的代码。

文章目录

标注方法

程序时间复杂度一般用"大O表示法(Big-O notation)"来表示。假如有如下代码:

def list_check(to_check, the_list):
	for item in the_list:
		if to_check == item:
			return True
	return False

上面代码功能很简单,就是检查to_check是否在列表the_list中。我们称这个函数的时间复杂度为 O ( n ) O(n) O(n),其中 n n n 指列表the_list中的元素个数, O ( n ) O(n) O(n)的意思是算法所需时间的_上限_随列表中的元素个数线性增长。

在我们描述时间复杂度时,通常会涉及2个数量:

  • O ( n ) O(n) O(n) 中的 n n n 通常表示容器中元素个数
  • O ( k ) O(k) O(k) 中的 k k k 通常表示参数或传入容器中元素个数

常见复杂度表

Big-O

复杂度

解释

O ( 1 ) O(1) O(1)

常量复杂度

无论输入的大小,运行时间始终保持一个常数。-
例如从哈希表中取值的时间复杂度就是 O ( 1 ) O(1) O(1)。

O ( n ) O(n) O(n)

线性复杂度

运行时间随输入大小线性增长。-
遍历列表就是一个时间复杂度为 O ( n ) O(n) O(n)的操作。

O ( n 2 ) O(n^{2}) O(n2)

平方复杂度

运行时间与输入大小呈平方关系。-
比如冒泡排序、插入排序的时间复杂度为 O ( n 2 ) O(n^2) O(n2)。

O ( 2 n ) O(2^{n}) O(2n)

指数复杂度

运行时间与输入大小呈指数关系。指数复杂度的算法性能非常低。-
例如图论中的三色问题就是指数复杂度。

O ( log ⁡ n ) O(\log_{n}) O(logn)

对数复杂度

当输入呈指数增长是,运行时间按线性增长。-
二分法查找就是典型的对数复杂度。

常见复杂度的图像展示

在这里插入图片描述

List操作

List是Python中使用最多的数据结构,熟悉List中各操作的时间复杂度对我们优化程序性能有很大帮助

操作

时间复杂度(平均情况)

追加 append()

O ( 1 ) O(1) O(1)

拷贝 copy()

O ( n ) O(n) O(n)

删除元素 remove()

O ( n ) O(n) O(n)

删除切片 del lst[2:4]

O ( n ) O(n) O(n)

插入 insert()

O ( n ) O(n) O(n)

获取元素 lst[0]

O ( 1 ) O(1) O(1)

设置元素 lst[0] = 1

O ( 1 ) O(1) O(1)

迭代

O ( n ) O(n) O(n)

获取切片 lst[0:3]

O ( k ) O(k) O(k)

设置切片 lst[0:3] = [4, 5]

O ( n + k ) O(n+k) O(n+k)

扩展 extend()

O ( k ) O(k) O(k)

排序 lst.sort()

O ( n log ⁡ n ) O(n \log_n) O(nlogn)

获取长度 len()

O ( 1 ) O(1) O(1)

in

O ( n ) O(n) O(n)

min()``max()

O ( n ) O(n) O(n)

Set操作

操作

时间复杂度(平均情况)

时间复杂度(最差情况)

in

O ( 1 ) O(1) O(1)

差集 s-t

O ( len ( s ) ) O(\text{len}(s)) O(len(s))

交集 s&t

O ( min ( len ( s ) , len ( t ) ) ) O(\text{min}(\text{len}(s), \text{len}(t))) O(min(len(s),len(t)))

O ( len ( s ) × len ( t ) ) O(\text{len}(s) \times \text{len}(t)) O(len(s)×len(t))

并集 s\|t

O ( len ( s ) + len ( t ) ) O(\text{len}(s) + \text{len}(t)) O(len(s)+len(t))

对称差集 s^t

O ( len ( s ) ) O(\text{len}(s)) O(len(s))

O ( len ( s ) × len ( t ) ) O(\text{len}(s) \times \text{len}(t)) O(len(s)×len(t))

多重交集 s1&s2&s3&...&sn

( n − 1 ) ∗ O ( l ) (n-1) * O(l) (n−1)∗O(l) 其中 l = max ( len ( s 1 ) , … , len ( s n ) ) l = \text{max}( \text{len}(s_1),\dots,\text{len}(s_n)) l=max(len(s1),…,len(sn))

s.difference_update(t)

O ( len ( t ) × len ( s ) ) O(\text{len}(t) \times \text{len}(s)) O(len(t)×len(s))

s.symetric_difference_update(t)

O ( len ( t ) ) O(\text{len}(t)) O(len(t))

Deque操作

deque是python标准库提供的双向队列

操作

时间复杂度(平均情况)

队尾追加 append()

O ( 1 ) O(1) O(1)

队首追加 appendleft()

O ( 1 ) O(1) O(1)

队尾扩展 extend()

O ( k ) O(k) O(k)

队首扩展 extendleft()

O ( k ) O(k) O(k)

队尾移除 pop()

O ( 1 ) O(1) O(1)

队首移除 popleft()

O ( 1 ) O(1) O(1)

拷贝 copy()

O ( n ) O(n) O(n)

删除 remove()

O ( n ) O(n) O(n)

轮转 rotate(k)

O ( k ) O(k) O(k)

猜你喜欢

转载自blog.csdn.net/qq_40647372/article/details/135377781