📜  算法分析|第5组(摊销分析简介)

📅  最后修改于: 2021-05-08 17:42:48             🧑  作者: Mango

摊销分析用于偶尔执行的操作速度非常慢但其他大多数操作执行速度更快的算法。在“摊销分析”中,我们分析一系列操作,并保证最坏情况下的平均时间低于特定昂贵操作的最坏情况下的时间。
使用摊销分析分析其操作的示例数据结构是哈希表,不交集和展开树。

让我们考虑一个简单的哈希表插入的示例。我们如何确定桌子的大小?在空间和时间之间需要权衡取舍,如果我们使散列表的大小变大,则搜索时间会变慢,但是所需的空间会变大。

动态表

解决此折衷问题的方法是使用动态表(或数组)。这个想法是在表变满时增加它的大小。当表已满时,请按照以下步骤进行操作。
1)为更大的表分配内存,通常是旧表的两倍。
2)将旧表的内容复制到新表。
3)释放旧桌子。

如果表中有可用空间,我们只需在可用空间中插入新项目即可。

使用上述方案的n次插入的时间复杂度是多少?
如果我们使用简单分析,则插入的最坏情况成本为O(n)。因此,n个刀片的最坏情况成本为n * O(n),即O(n 2 )。该分析给出了n个插入的上限,但没有严格的上限,因为所有插入都不花费Θ(n)时间。

摊销分析

因此,使用摊销分析,我们可以证明动态表方案具有O(1)插入时间,这在哈希处理中是一个很好的结果。同样,动态表的概念用在C++中的向量中, Java的ArrayList中。

以下是一些重要说明。
1)一系列业务的摊销成本可以看作是受薪人员的支出。该人的平均每月支出小于或等于薪水,但是该人可以在特定月份通过购买汽车或其他东西来花更多的钱。在其他月份,他或她为昂贵的一个月省钱。

2)上面对动态数组示例进行的摊销分析称为汇总方法。有两种更强大的方法可以进行摊销分析,称为“会计方法” 势法。我们将在单独的文章中讨论其他两种方法。

3)摊销分析不涉及概率。平均情况下运行时间还有另一种不同的概念,其中算法使用随机化使它们更快,并且预期运行时间比最坏情况下的运行时间快。使用随机分析对这些算法进行分析。这些算法的示例是“随机快速排序”,“快速选择”和“散列”。我们很快将在另一篇文章中介绍随机分析。

红黑树中插入的摊销分析

让我们讨论使用势能方法对红黑树操作的摊销分析(插入)。

为了进行红黑树插入操作的摊销分析,我们使用电位(或物理学家)方法。对于潜在方法,我们定义一个潜在函数\phi  将数据结构映射为非负实数值。操作可能会导致这种潜力的改变。

让我们定义潜在函数\phi  以以下方式:

(1)   \begin{equation*} g(n)=\begin{cases} 0, & \text{if n is red}.\\ 1, & \text{if n is black with no red children}. \\ 0, & \text{if n is black with one red child}.\\ 2, & \text{if n is black and has two red children }.\\ \end{cases} \end{equation*}

其中n是红黑树的节点

电位函数\phi  = \sum_{} g(n)  在红黑树的所有节点上。

此外,我们将工序的摊销时间定义为:

摊销时间= c + \Delta\phi  (H)

\Delta\phi  (h)= \phi  (H’) – \phi  (H)
其中h和h’分别是操作前后的红黑树状态
c是实际操作成本

对于低成本运营,潜力的变化应该是积极的,而对于高成本运营,潜力的变化应该是消极的。

在红黑树的叶子上插入一个新节点。我们拥有以下任一类型的红黑树的叶子:

插入及其摊销分析可以表示为:
(1)

通过首先给父级和另一个同级(红色)重新着色来执行此插入。然后考虑该叶节点的祖父母和叔叔进行进一步的重新着色,从而导致摊销成本-1 (当叶节点的祖父母为红色时),- 2 (当叶的叔叔是黑色且祖父母为黑色时)或+1 (当叶子的叔叔是红色而祖父母是黑色时)。插入可以显示为:

(2)

在此插入中,节点插入时没有任何变化,因为叶子的黑色深度保持不变。当叶子可能具有黑色同级没有任何同级时就是这种情况(因为我们认为空节点的颜色是黑色)。

因此,此插入的摊销成本0

(3)

在此插入中,我们无法为叶节点,其父节点和同级兄弟重新着色,以使黑色深度与以前相同。因此,我们需要执行左右旋转。

旋转后,当g(插入的节点)的祖父母为黑色时,没有任何变化。同样,对于g(插入的节点)的Red Grandparent,我们没有任何更改。因此,插入将以摊余成本= +2完成。插入内容如下图所示:

在红黑树的叶子位置计算了这些特定的摊销成本之后,我们可以讨论在红黑树中插入的总摊销成本的性质。因为这可能发生,所以两个红色节点可能具有父子关系,直到红黑树的根为止。

因此,在极端(或拐角)情况下,我们将带有两个红色孩子的黑色节点的数量减少1,并且最多将没有红色孩子的黑色节点的数量增加1,从而使潜在损失最多减少1函数。由于每次操作要支付一个单位的潜在费用

\Delta\phi  (H) \leq  ñ
其中n是节点总数

因此,在红黑树中插入的总摊销成本O(n)

对于关于在红黑树中插入的任何疑问,您可以参考《在红黑树中插入》。

资料来源:
伯克利讲座35:摊销分析
麻省理工学院第十三讲:摊销算法,表格加倍,潜在方法
http://www.cs.cornell.edu/courses/cs3110/2011sp/lectures/lec20-amortized/amortized.htm
http://web.iitd.ac.in/~csz188551/COL106_2019/