Big o 摊销分析的基本问题
数据结构支持操作foo,使得在最坏的情况下,n个操作foo的序列需要Θ(n logn)时间来执行 a) foo运营的摊销时间是多少 b) 单个foo操作的实际时间有多大 a) 首先,我假设foo是O(logn)最坏的情况。 因此,摊销成本来自于foo讲述其最坏情况的频率。由于我们不知道进一步的情况,摊销时间在O(1)和logn之间 b) O(对数n) 这是正确的吗?如果Big o 摊销分析的基本问题,big-o,amortized-analysis,Big O,Amortized Analysis,数据结构支持操作foo,使得在最坏的情况下,n个操作foo的序列需要Θ(n logn)时间来执行 a) foo运营的摊销时间是多少 b) 单个foo操作的实际时间有多大 a) 首先,我假设foo是O(logn)最坏的情况。 因此,摊销成本来自于foo讲述其最坏情况的频率。由于我们不知道进一步的情况,摊销时间在O(1)和logn之间 b) O(对数n) 这是正确的吗?如果n操作采用Θ(n logn),那么根据定义,一个foo操作的摊销时间是Θ(logn)所有操作的摊销时间是平均的,所以你不需要只计
n
操作采用Θ(n logn)
,那么根据定义,一个foo
操作的摊销时间是Θ(logn)
所有操作的摊销时间是平均的,所以你不需要只计算导致它的操作的最坏情况,但也对其他所有资产进行了摊销
b) foo
有时会花费O(n)
,只要不超过O(logn)
次foo
甚至偶尔会花费O(n log n)
,只要发生次数不超过常量(即O(1)
)
当您进行摊销分析时,您不会将最坏情况乘以操作数,而是乘以最坏情况实际发生的次数
例如,采取一次将一个元素推入一个向量的策略,但每次新元素不适合当前分配时,通过将分配的大小加倍来增加内存。每个加倍实例的成本O(n)
,因为您必须复制/移动所有当前元素。但摊销时间实际上是线性的,因为你一次复制1个元素,一次复制2个元素,一次复制4个元素,等等:总的来说,你已经做了成倍的工作,但是每一项的成本总和只是1+2+4+8+…+n=2*n-1=O(n)
。因此,尽管最坏的情况是O(n)
,但这种push
实现的摊销时间是O(1)