平均情况和摊销分析之间的差异
Posted
技术标签:
【中文标题】平均情况和摊销分析之间的差异【英文标题】:Difference between average case and amortized analysis 【发布时间】:2011-11-12 02:23:45 【问题描述】:我正在阅读一篇关于算法摊销分析的文章。下面是一段文字sn-p。
摊销分析类似于平均情况分析,因为它是 关注一系列操作的平均成本。 然而,平均案例分析依赖于概率假设 关于数据结构和操作,以便计算 算法的预期运行时间。因此它的适用性是 取决于关于概率分布的某些假设 算法输入。
平均案例界限并不排除人们将 变得“不走运”并遇到需要超出预期的输入 即使输入概率分布的假设是 有效。
我对上述文本 sn-p 的问题是:
在第一段中,平均情况分析如何“依赖于关于数据结构和操作的概率假设?”我知道平均情况分析取决于输入的概率,但上述陈述是什么意思?
作者在第二段中的意思是,即使输入分布有效,平均情况也不有效?
谢谢!
【问题讨论】:
看看这个,第二条评论,非常非常好!!哈哈programmers.stackexchange.com/questions/161404/… @sorry_I_wont 看起来评论已被删除,因为我没有看到任何内容。 【参考方案1】:平均案例分析对某些情况下可能无法满足的输入做出假设。因此,如果您的输入不是随机的,在最坏的情况下,算法的实际性能可能比平均情况慢得多。
摊销分析不做这样的假设,但它会考虑一系列操作的总体性能,而不仅仅是一个操作。
动态数组插入提供了一个摊销分析的简单示例。一种算法是分配一个固定大小的数组,并在插入新元素时,在必要时分配一个两倍于旧长度的固定大小数组。在最坏的情况下,插入所需的时间与整个列表的长度成正比,因此在最坏的情况下,插入是一个 O(n) 操作。但是,您可以保证这种最坏情况很少发生,因此插入是使用摊销分析的 O(1) 操作。无论输入是什么,摊销分析都成立。
【讨论】:
【参考方案2】:要获得平均情况时间复杂度,您需要对“平均情况”是什么做出假设。如果输入是字符串,那么“平均字符串”是什么?只有长度重要吗?如果是这样,我将得到的字符串的平均长度是多少?如果不是,这些字符串中的平均字符是多少?例如,如果字符串是姓氏,则很难明确回答这些问题。平均姓氏是多少?
在大多数有趣的统计样本中,最大值大于平均值。这意味着您的平均案例分析有时会低估某些输入所需的时间/资源(这是有问题的)。如果您考虑一下,对于对称 PDF,平均案例分析应该低估和高估一样多。最坏情况分析 OTOH 只考虑最有问题的情况,因此肯定会高估。
【讨论】:
您很好地谈论“平均案例”,但如果它也清楚地说明“摊销案例”的作用,这个问题会更好。【参考方案3】:考虑计算未排序数组中的最小值。也许你知道它有O(n)
运行时间,但如果我们想要更精确,它会在平均情况下进行n/2
比较。为什么这个?因为我们正在对数据进行假设;我们假设最小值可以以相同的概率出现在每个位置。
如果我们改变这个假设,例如我们说处于第 i 个位置的概率随着 i 的增加而增加,我们可以证明一个不同的比较数,甚至是一个不同的渐近界。
在第二段中,作者说,通过平均案例分析,我们可能非常不走运,并且测量的平均案例大于理论案例;回想一下前面的例子,如果我们在 m 个大小为 n 的不同数组上运气不好,并且最小值每次都在最后一个位置,那么我们将测量 n
平均情况而不是 n/2
。当摊销界限被证明时,这不会发生。
【讨论】:
如何计算只有 n/2 个比较的未排序数组中的最小值?我认为您恰好需要n-1。不仅平均,而且总是如此。 我同意@StefanPochmann。我只是想补充一点,我将使用在数组中查找元素的示例来更改示例。在这种情况下,假设您的算法从左到右直到找到元素,它会在找到它时停止,您可以坚持您正在执行的分析。以上是关于平均情况和摊销分析之间的差异的主要内容,如果未能解决你的问题,请参考以下文章