time-complexity - 平均案例分析与摊销分析
问题描述
现在我正在学习平均案例分析和摊销案例分析,我开始想知道你什么时候会使用平均案例分析以及什么时候使用摊销案例分析。他们也完成同样的事情吗?
解决方案
平均情况分析不同于摊销分析。差异是微妙的。
平均案例分析研究是从给定大小的所有问题实例的集合中随机选择单个问题实例时的预期运行时间,受这些问题实例的某些特定概率分布的影响。
摊销分析研究是按特定顺序解决多个问题的实例时的预期聚合运行时间。
考虑以下算法:
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) 的摊销复杂度。
推荐阅读
- python-3.x - 将列数据类型从 Timestamp 更改为 datetime64
- c++ - 如何创建 NVIDIA OpenCL 项目
- sql-server - 如何在 Microsoft SQL 查询的参数化 XQuery 表达式中使用 unicode 字符
- github - GitHub - 从存储库中删除后,它不显示我的贡献
- html - 为什么每次写入大文本时我的 div 框都会变宽?
- android - 从顶部拉出类似于 SystemUI 应用程序中的快速设置覆盖时如何显示覆盖?
- r - fileInput 在 Docker Windows 系统中无法正常工作
- qt - 如何设置动态创建的对象的一个或多个属性?
- node.js - 为什么本地 Firebase 文档删除功能不起作用而服务版本起作用?
- sql-server - 使用日期时间过滤器将 SQL Server 数据提取到 SAS