【发布时间】:2020-07-17 23:30:37
【问题描述】:
现在我正在学习平均案例分析和摊销案例分析,我开始想知道您究竟何时会使用平均案例分析以及何时使用摊销案例分析。他们也完成同样的事情吗?
【问题讨论】:
标签: time-complexity runtime complexity-theory
现在我正在学习平均案例分析和摊销案例分析,我开始想知道您究竟何时会使用平均案例分析以及何时使用摊销案例分析。他们也完成同样的事情吗?
【问题讨论】:
标签: time-complexity runtime complexity-theory
平均案例分析不同于摊销分析。差别很微妙。
平均案例分析研究是从给定大小的所有问题实例的集合中随机选择单个问题实例时的预期运行时间,受这些问题实例的特定概率分布的影响。
摊销分析研究是按特定顺序解决多个问题实例时的预期聚合运行时间。
考虑以下算法:
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 需要恒定的时间。运行 n = 1 只执行一个递归步骤,因为我们缓存了 n = 0 的结果。继续,我们很好,所有执行只需要一个递归步骤,因为我们的执行序列已经缓存了递归调用的所有结果。因此,要执行 k 次,我们做 O(k) 的工作;这意味着每个单独的执行都具有 O(1) 的摊销复杂度。
【讨论】: