代码改变世界

算法导论 平摊分析

  youxin  阅读(1032)  评论(0编辑  收藏  举报

计算机科学中,特别是算法分析,平摊分析寻找在最坏情况下的操作序列中每操作的平均耗费时间。平摊分析只保证最坏情况性能的每操作耗费时间,不涉及平均情况性能。

这个方法需要知道操作序列中可能发生的每个操作。通常应用在操作间存在状态的数据结构基本思想是一个最坏情况操作会改变状态从而不会在一段时间内再次出现,因此"平摊"它的耗费。

一个简单的例子,在某个特定实现的动态数组中,我们在每次数组溢出时增长数组的长度至原来的两倍。因此需要数组空间分配,在最坏情况下一个插入操作需要O(n)的时间。但是,一个 n 个插入的操作序列仍然可以在 O(n) 的时间内完成,因为剩下的插入可以在常数时间内完成,因此 n 个插入可以在 O(n) 的时间内完成。因此每操作的平摊耗费为O(n) / n = O(1)。

注意平摊分析与平均时间分析和概率算法的概率分析不同。在平均时间分析中,我们平均化所有可能的输入; 在概率算法的概率分析中,我们平均化所有可能的随机选择;在平摊分析中,我们平均化一系列操作的耗费。平摊分析假设的是最坏情况输入并且通常不运行随机选择。

平摊分析中几种常用的技术:

  • 聚合分析决定 n 个操作序列的耗费上界 T(n),然后计算平均耗费为 T(n) / n
  • 记账方法确定每个操作的耗费,结合它的直接执行时间及它在对运行时中未来操作的影响。通常来说,许多短操作增量累加成"债",而通过减少长操作的次数来"偿还"。
  • 势能方法类似记账方法,但通过预先储蓄"势能"而在需要的时候释放。

amortized analysis(平摊分析)

how large should a hash table be?

2个方面,

1.as large as possible搜索快 time

2.as small as possible 节约存储空间 space

应该是theta(n) for n items.

 

 

编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
历史上的今天:
2012-08-27 javascript 事件处理
2012-08-27 Javascript DOM 编程艺术:ENHANCING CONTENT
点击右上角即可分享
微信分享提示