计算复杂度与递归编程全解析
1. 计算复杂度基础
1.1 列表扩容与摊销复杂度
在处理列表时,列表的扩容机制是一个关键的性能因素。当我们使用 append 操作向列表中添加元素时,若列表的固定大小空间不足,就需要进行扩容。
第一次需要将列表大小翻倍是在第二次调用 append 时。此时存储了两个“虚拟美元”,在将旧列表中的一个元素复制到能容纳两个元素的新固定大小列表时,会使用其中一个“虚拟美元”。
当对列表的版本 B 调用 append 得到版本 C 时,会存储三个“虚拟美元”,用于将列表大小翻倍到四个位置。在将旧列表内容复制到新列表时,会使用其中两个“虚拟美元”。当大小为四的列表填满时,又进行了两次 append 操作,存储了五个“虚拟美元”,在从步骤 E 复制到步骤 F 时会使用其中四个。当大小为八的列表在步骤 G 填满时,有九个存储的“虚拟美元”用于列表大小翻倍和元素复制。
如果每次不将列表大小翻倍,而是每次增加其前一次大小的一半,只要每次列表扩展时其大小与当前大小成比例增长,通过为每次 append 操作存储四个“虚拟美元”,仍可证明向列表追加元素是一个 $O(1)$ 操作。
Python 的列表对象用 C 语言实现,C 语言只能分配固定大小的列表(即数组),但 Python 列表对象能以 $O(1)$ 时间复杂度执行 append 操作。Python 列表的 append 实现通过在固定大小数组空间不
递归编程与计算复杂度解析
超级会员免费看
订阅专栏 解锁全文
10万+

被折叠的 条评论
为什么被折叠?



