我想我理解这个概念。让我解释一下我如何理解它对doubling array vectors
的应用。
将项目复制到数组的速率保持不变。虽然阵列的增长是指数级的,但阵列需要加倍的速率是对数的。因此,减少数组大小加倍的出现次数会减少数组加倍和复制元素所需的资源,因为这只会在数组的整个生命周期中发生
O(n Log N)
次。因此,增长率的O(n^2)
与数组生长频率的O(n Log N)
相结合,可解析为O(n)
左右。
这是对的吗?如果没有,哪些部分是错的?我在缠绕这个问题时遇到了麻烦。我很确定我给的Big Oh符号是不正确的。
由于
答案 0 :(得分:1)
我们假设您在数组到达2
个元素时加倍,4
,8
,16
,32
,...... ,2^k
。
这意味着O(log n)
对大小为n
的数组进行双倍操作。很有诱惑力地说这是O(n log n)
,但情况并非如此。
所有这些倍增操作的操作次数超出以下范围:
1 + 2 + 4 + ... + 2^k = (2^k - 1) (sum of geometric series)
然而请注意k = number of doubling ops = O(log n)
,因此我们有2^(log n) = n
所以,整个事情仍然是O(n)
:当你把阵列加倍时做很多操作,考虑到那些"很多操作"相对于整个数组大小以及执行它们的次数,它们不再是#34;很多",只是O(n)
。
摊销基本上意味着你要牢记大局:当然,我今天可能要做很多工作,但这意味着我将在本周余下的时间里呆在家里。这是否意味着本周我会有很多工作?不,我实际上工作得很少。
我认为你的解释并不完全准确且过于复杂。没有任何类型,并且没有O(n^2)
增长率。正如您所见,数学加起来只是O(n)
。
我的建议一般是你忽略了摊销这个词,只是做数学。我已经看到它没有充分理由引起很多混乱。当然,这可能是参与此类分析的正式事情,但大多数时候它只会引发对所发生事件的混淆。只要问问自己:"好吧,这个算法会执行多少次操作?"。通常情况下,你不需要任何想要回答这个问题的东西。
答案 1 :(得分:0)
不讨论你如何计算“摊销”时间,但它有什么好处:你可能有一个反复使用的算法从状态1到状态2到状态3 ...依此类推。从一个州到另一个州的成本可能差异很大,从一个州到另一个州的最高成本可能非常高。但是,有时您可以证明通过状态1到状态n的总成本远小于最大值的n倍。因此,“摊销”成本是从州1到州n的平均成本。
有时最高成本可能很重要。例如,在音乐播放应用程序中,输出下一个音乐样本的时间必须总是低,否则声音会断断续续,这是不可接受的。但是,在其他情况下,重要的是通过所有州的总时间,只要平均值很好就可以了。
请注意,摊销时间与平均时间不同。算法可能需要不同的时间,具体取决于给定的数据。如果某些输入X比平均值长得多,则可能是您使用该算法一百万次来处理相同的输入X并且总时间很长。