Python 操作复杂度速查表

Python 内置的数据结构,如 列表集合字典,提供了大量的操作,使我们能够编写简洁的代码。然而,如果不了解这些操作的复杂度,有时会导致程序运行速度低于预期。

这份速查表旨在帮助开发者理解这些数据结构常见操作的平均时间复杂度和最坏情况复杂度,从而帮助大家在 Python 中编写出经过优化、高效的代码。

列表时间复杂度

Python 中的 列表 是一个有序的、可变的序列,通常被实现为动态数组。以下是常见列表操作的时间复杂度:

操作

示例

平均情况

摊销最坏情况

追加

l.append(item)

O(1)

O(1) (resize)

清空

l.clear()

O(1)

O(1)

包含检查

item in/not in l

O(N)

O(N)

复制

l.copy()

O(N)

O(N)

删除

del l[i]

O(N)

O(N)

扩展

l.extend(…)

O(N)

O(N)

相等性比较

l1==l2, l1!=l2

O(N)

O(N)

索引

l[i]

O(1)

O(1)

迭代

for item in l:

O(N)

O(N)

长度

len(l)

O(1)

O(1)

重复

kl

O(kN)

O(kN)

最小值, 最大值

min(l), max(l)

O(N)

O(N)

弹出末端

l.pop(-1)

O(1)

O(1)

弹出中间

l.pop(item)

O(N)

O(N)

移除

l.remove(…)

O(N)

O(N)

反转

l.reverse()

O(N)

O(N)

切片

l[x:y]

O(y-x)

O(y-x)

排序

l.sort()

O(N log N)

O(N log N)

按索引赋值

l[i]=item

O(1)

O(1)> 注意:* 元组具有相同的操作(不可变)和复杂度。

字典时间复杂度

Python 中的 字典 是作为哈希表实现的,这使得基于键的操作非常高效。以下是各项操作的复杂度:

操作

示例

平均情况

摊销最坏情况

清空

d.clear()

O(1)

O(1)

构建

dict(…)

O(len(d))

O(len(d))

删除

del d[k]

O(1)

O(N)

获取

d.get()

O(1)

O(N)

迭代(键, 值, 项)

for item in d:

O(N)

O(N)

长度

len(d)

O(1)

O(1)

弹出

d.pop(item)

O(1)

O(N)

弹出项

d.popitem()

O(1)

O(1)

返回视图

d.values()

O(1)

O(1)

返回键

d.keys()

O(1)

O(1)

Fromkeys

d.fromkeys(seq)

O(len(seq))

O(len(seq))> 注意: Defaultdict 与 dict 拥有相同的操作和时间复杂度,因为它继承自 dict。

集合时间复杂度

Python 的 集合 是另一个基于哈希的集合,针对成员检查和集合运算进行了优化:

操作

示例

平均情况

摊销最坏情况

添加

s.add(item)

O(1)

O(N)

清空

s.clear()

O(1)

O(1)

复制

s.copy()

O(N)

O(N)

包含检查

item in/not in s

O(1)

O(N)

创建

set(…)

O(len(s))

O(len(s))

丢弃

s.discard(item)

O(1)

O(N)

差集

s1-s2

O(len(s1))

O(len(s1))

差集更新

s1.difference_update(s2)

O(len(s2))

相等性

s1==s2, s1!=s2

O(min(len(s1), len(s2)))

O(min(len(s1), len(s2)))

交集

s1 & s2

O(min(len(s1), len(s2)))

O(min(len(s1), len(s2)))

迭代

for item in s:

O(N)

O(N)

是否子集

s1<=s2

O(len(s1))

O(len(s1))

是否超集

s1>=s2

O(len(s2))

O(len(s1))

弹出

s.pop()

O(1)

O(N)

并集

s1\

s2

O(len(s1)+len(s2))

– 对称差集

s1^s2

len(s1)

O(len(s1)*len(s2))## 元组时间复杂度
元组 是不可变序列,这使得它们比列表更轻量,但操作也相对有限:

操作

示例

平均情况

最坏情况

按索引访问

(e.g., t[i])

O(1)

O(1)

搜索

(e.g., x in t)

O(n)

O(n)

迭代

(e.g., for x in t)

O(n)

O(n)## 字符串时间复杂度
字符串 是不可变的,在时间复杂度方面与元组类似:

操作

示例

平均情况

最坏情况

按索引访问

(e.g., s[i])

O(1)

O(1)

拼接

(e.g., s1 + s2)

O(n)

O(n)

搜索

(e.g., x in s)

O(n)

O(n)

长度

(e.g., len(s))

O(1)

O(1)

切片

(e.g., s[start:end])

O(k)

O(k)

迭代

(e.g., for c in s)

O(n)

O(n)> ### 核心要点 –

>

> 列表 (Lists):

>

> – 摊销复杂度 适用于 append(),因为调整大小只是偶尔发生。

> – 在任意位置的插入和删除操作效率较低(O(N)),因为可能需要移动后续元素。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/48956.html
点赞
0.00 平均评分 (0% 分数) - 0