Algorithm 固定摊销时间

Algorithm 固定摊销时间,algorithm,complexity-theory,big-o,Algorithm,Complexity Theory,Big O,当谈到算法的时间复杂度时,“固定摊销时间”是什么意思?这意味着随着时间的推移,最坏情况将默认为O(1),或固定时间。一个常见的例子是动态数组。如果我们已经为一个新条目分配了内存,那么添加它将是O(1)。如果我们没有分配它,我们将通过分配,比如说,当前金额的两倍来分配。这个特殊的插入将不是O(1),而是其他东西 重要的是,算法保证在一系列操作之后,昂贵的操作将被摊销,从而使整个操作O(1) 或者更严格地说, 有一个常数c,对于 每个操作序列(也是一个以昂贵的操作结束的操作) 长度L,时间不大于 c

当谈到算法的时间复杂度时,“固定摊销时间”是什么意思?

这意味着随着时间的推移,最坏情况将默认为O(1),或固定时间。一个常见的例子是动态数组。如果我们已经为一个新条目分配了内存,那么添加它将是O(1)。如果我们没有分配它,我们将通过分配,比如说,当前金额的两倍来分配。这个特殊的插入将不是O(1),而是其他东西

重要的是,算法保证在一系列操作之后,昂贵的操作将被摊销,从而使整个操作O(1)

或者更严格地说,

有一个常数c,对于 每个操作序列(也是一个以昂贵的操作结束的操作) 长度L,时间不大于 c*L(谢谢)


这意味着随着时间的推移,最坏的情况将默认为O(1),或恒定时间。一个常见的例子是动态数组。如果我们已经为一个新条目分配了内存,那么添加它将是O(1)。如果我们没有分配它,我们将通过分配,比如说,当前金额的两倍来分配。这个特殊的插入将不是O(1),而是其他东西

重要的是,算法保证在一系列操作之后,昂贵的操作将被摊销,从而使整个操作O(1)

或者更严格地说,

有一个常数c,对于 每个操作序列(也是一个以昂贵的操作结束的操作) 长度L,时间不大于 c*L(谢谢)


用简单的术语解释摊销时间:

如果你做了一个手术,比如说一百万次,你并不真正关心这个手术的最坏情况或最好情况——你关心的是当你重复这个手术一百万次时,总共花了多少时间

因此,只要“偶尔一次”足够罕见,缓慢程度足以被冲淡,那么偶尔一次操作是否非常缓慢并不重要。实质上,摊销时间是指“如果您进行了多次操作,则每次操作所用的平均时间”。摊销时间不一定是常数;您可以有线性和对数摊销时间或其他任何形式

让我们以mats的动态数组为例,您可以在其中重复添加新项目。通常添加项目需要固定的时间(即,
O(1)
)。但每次阵列满时,都会分配两倍的空间,将数据复制到新区域,然后释放旧空间。假设分配和释放以固定时间运行,此放大过程需要
O(n)
时间,其中n是数组的当前大小


所以每次放大,所需时间是上次放大的两倍。但你在做这件事之前也等了两倍的时间!因此,每次扩大的成本可以在插入中“分摊”。这意味着,从长期来看,向数组中添加m个项目所花费的总时间是
O(m)
,因此摊销时间(即每次插入的时间)是
O(1)

用简单的术语解释的摊销时间:

如果你做了一个手术,比如说一百万次,你并不真正关心这个手术的最坏情况或最好情况——你关心的是当你重复这个手术一百万次时,总共花了多少时间

因此,只要“偶尔一次”足够罕见,缓慢程度足以被冲淡,那么偶尔一次操作是否非常缓慢并不重要。实质上,摊销时间是指“如果您进行了多次操作,则每次操作所用的平均时间”。摊销时间不一定是常数;您可以有线性和对数摊销时间或其他任何形式

让我们以mats的动态数组为例,您可以在其中重复添加新项目。通常添加项目需要固定的时间(即,
O(1)
)。但每次阵列满时,都会分配两倍的空间,将数据复制到新区域,然后释放旧空间。假设分配和释放以固定时间运行,此放大过程需要
O(n)
时间,其中n是数组的当前大小


所以每次放大,所需时间是上次放大的两倍。但你在做这件事之前也等了两倍的时间!因此,每次扩大的成本可以在插入中“分摊”。这意味着从长期来看,向数组中添加m个项目所花费的总时间是
O(m)
,因此摊销时间(即每次插入的时间)是
O(1)

上述解释适用于聚合分析,即在多个操作中取“平均值”的想法。 我不确定它们是如何应用于银行家方法还是物理学家的摊销分析方法

现在。我不能完全肯定正确的答案。 但这和物理学家和银行家方法的基本条件有关:

(摊余经营成本之和)>=(实际经营成本之和)

我面临的主要困难是,鉴于运营的摊余渐进成本不同于正常的渐进成本,我不确定如何评估摊余成本的重要性

也就是说,当有人给我一个摊余成本时,我知道它和正常的渐近成本不一样,那么我从摊余成本中得出什么结论呢

由于我们有一些业务被多收费,而其他业务被少收费的情况,一个假设可能是引用个别业务的摊余成本是没有意义的

例如:对于fibonacci堆,引用仅将键减少到O(1)的摊销成本是没有意义的,因为成本是通过“增加堆潜力的早期操作所做的工作”来减少的

我们可以有另一个假设,即摊余成本的原因如下:

  • 我知道那些费用
    import matplotlib.pyplot as plt
    import time
    
    
    a = []
    N = 1000000
    
    totalTimeList = [0]*N
    timeForThisIterationList = [0]*N
    for i in range(1, N):
        startTime = time.time()
        a.append([0]*500) # every iteartion, we append a value(which is a list so that it takes more time)
        timeForThisIterationList[i] = time.time() - startTime
        totalTimeList[i] = totalTimeList[i-1] + timeForThisIterationList[i]
    max_1 = max(totalTimeList)
    max_2 = max(timeForThisIterationList)
    
    plt.plot(totalTimeList, label='cumulative time')
    plt.plot(timeForThisIterationList, label='time taken per append')
    plt.legend()
    plt.title('List-append time per operation showing amortised linear complexity')
    plt.show()