平均案例分析与摊销分析

Average Case Analysis vs Amortized Analysis

现在我正在学习平均案例分析和摊销案例分析,我开始想知道你到底什么时候会用平均案例分析,什么时候会用摊销案例分析。他们也完成同样的事情吗?

平均案例分析不同于摊销分析。区别很微妙。

  • 平均案例分析研究是从给定大小的所有问题实例集合中随机选择单个问题实例的预期 运行时间,服从这些实例的特定概率分布问题实例。

  • 摊销分析研究是按特定顺序解决多个问题实例时的预期总计运行时间。

考虑以下算法:

dict = {}

Foo(bar[1...n])
1. if dict[bar] exists, return dict[bar]
2. if n is even then
3.     dict[bar] = bar[1] if n > 0, or else 0 if n = 0
4. else if n is odd then
5.     dict[bar] = foo(bar[1...(n-1)/2]
6. return dict[bar]

平均情况分析:假设所有长度为n的列表都是等可能的(要么假设数组中的值取自有限集合,要么不同的数组可以放入有限多等价类不是基于绝对大小,而是基于相对大小)。因此,对于大小为 n 的输入,平均情况 运行 时间在 n 为偶数时为 O(1),而在 n 为奇数时为 O(log(n))(在最坏情况下,n=1、3、 7, 15, 31, ...,你必须减去一再减半,直到你一直减到 1)。

摊销分析:假设您想运行在仅包含数字 1、长度从 0 开始一直到 k 的数组上执行此算法。 运行n = 0 的 ning 需要常数时间。 运行 for n = 1 只执行一个递归步骤,因为我们缓存了 n = 0 的结果。继续,我们罚款所有执行只采取一个递归步骤,因为我们的执行序列已经缓存了递归调用的所有结果。因此,要执行 k 次,我们需要做 O(k) 次工作;这意味着每个单独的执行都具有 O(1) 的摊销复杂性。