📅  最后修改于: 2021-01-12 03:30:06             🧑  作者: Mango
为了衡量算法的资源消耗,使用了本章中讨论的不同策略。
函数f(n)的渐近行为是指随着n变大, f(n)的增长。
通常,我们忽略n的较小值,因为我们通常对估算程序在大输入下的运行速度很感兴趣。
一个好的经验法则是,渐近增长率越慢,算法越好。虽然并非总是如此。
例如,线性算法$ f(n)= d * n + k $总是渐近地优于二次算法$ f(n)= cn ^ 2 + q $。
递归是一个方程或不等式,用较小的输入值来描述函数。递归通常用于分而治之范式。
让我们将T(n)看作是大小为n的问题的运行时间。
如果问题的大小足够小,例如n
为了解决该问题,所需时间是aT(n / b) 。如果我们认为除法所需的时间为D(n) ,而合并子问题的结果所需的时间为C(n) ,则递归关系可以表示为-
$$ T(n)= \开始{cases} \:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\ :: \:\:\:\:\ theta(1)&if \:n \ leqslant c \\ a T(\ frac {n} {b})+ D(n)+ C(n)&否则\ end {情况} $$
递归关系可以使用以下方法解决-
替代方法-在这种方法中,我们猜测一个界限,并使用数学归纳法证明我们的假设是正确的。
递归树方法-在此方法中,形成递归树,其中每个节点代表成本。
大师定理-这是发现递归关系复杂性的另一项重要技术。
摊销分析通常用于执行一系列相似操作的某些算法。
摊销分析提供了整个序列的实际成本的限制,而不是分别限制操作序列的成本。
摊销分析不同于平均案例分析;摊销分析不涉及概率。摊销分析可确保在最坏的情况下每个操作的平均性能。
由于设计和分析紧密相关,因此它不仅是一种分析工具,还是一种思考设计的方法。
聚合方法提供了问题的全局视图。在这种方法中,如果n次操作总共花费最坏情况下的时间T(n) 。那么,每个操作的摊销成本为T(n)/ n 。尽管不同的操作可能花费不同的时间,但是在此方法中,可以忽略不计的成本。
在这种方法中,根据实际费用将不同的费用分配给不同的操作。如果工序的摊销成本超过其实际成本,则将差额作为贷项分配给对象。该信用额有助于支付以后的业务,这些业务的摊余成本小于实际成本。
如果第i次操作的实际成本和摊销成本是$ c_ {i} $和$ \ hat {c_ {l}} $,则
$$ \ displaystyle \ sum \ limits_ {i = 1} ^ n \ hat {c_ {l}} \ geqslant \ displaystyle \ sum \ limits_ {i = 1} ^ n c_ {i} $$
此方法将预付费功表示为势能,而不是将预付费功视为功劳。可以释放这种能量来支付将来的运行费用。
如果我们从初始数据结构D 0开始执行n次操作。让我们考虑, c i是实际成本, D i是第i次操作的数据结构。势函数Ф映射到实数Ф( D i ),即相关的D i势。摊销成本$ \ hat {c_ {l}} $可以定义为
$$ \ hat {c_ {l}} = c_ {i} + \ Phi(D_ {i})-\ Phi(D_ {i-1})$$
因此,总摊销成本为
$$ \ displaystyle \ sum \ limits_ {i = 1} ^ n \ hat {c_ {l}} = \ displaystyle \ sum \ limits_ {i = 1} ^ n(c_ {i} + \ Phi(D_ {i} )-\ Phi(D_ {i-1}))= \ displaystyle \ sum \ limits_ {i = 1} ^ n c_ {i} + \ Phi(D_ {n})-\ Phi(D_ {0})$ $
如果为表分配的空间不足,则必须将表复制到更大的表中。同样,如果从表中删除了大量成员,则最好以较小的大小重新分配表。
使用摊销分析,我们可以证明插入和删除的摊销成本是恒定的,动态表中未使用的空间永远不会超过总空间的恒定分数。
在本教程的下一章中,我们将简要讨论渐近符号。