$ \ phi_1= 1 $或$ \ phi_1= 2 $于动态$ \ text {table-insert} $,其中$ \ phi_i $是$ i $ th操作后的潜在函数,根据clrs
题
以下是通过Cormen从“动态表,对算法介绍。等。 al。
在以下伪代码中,我们假设 $ t $ 是表示表的对象。字段 $ table [t] $ 包含代表表的存储块的指针。字段 $ num [t] $ 包含表中的项目数,字段 $ size [t] $ 是表中的插槽总数。最初,表是空的: $ num [t]= size [t]= 0 $ 。
$ \ text {table-insert(t,x)} $
$ 1 \ quad \ text {if $ size [t]= 0 $} $
$ 2 \ quad \ quad \ text {然后分配$ table [t] $,$ 1 $ slot} $
$ 3 \ quad \ quad大小[t] \ refrarrow 1 $
$ 4 \ quad \ text {if} num [t]= size [t] $
$ 5 \ quad \ quad \ text {然后分配$ 2 $ new {\ text { - }} $ 2 \ cdot size [t] $ slots} $
$ 6 \ quad \ quad \ quad \ text {将$ tools [t] $中的所有项目插入$ new {\ text { - }}表$} $
$ 7 \ quad \ quad \ quad \ text {free $ table [t] $} $
$ 8 \ quad \ quad \ quad表[t] \ refrarrow new {\ text { - }}表$
$ 9 \ quad \ quad \ quad尺寸[t] \ leftarrow 2 \ cdot size [t] $
$ 10 \ quad \ text {插入$ x $ to $ table [t] $} $
$ 11 \ quad num [t] \ leatarrow num [t] + 1 $
对于 $ n $ $ \ text {table-insert} $ 他们选择的潜在功能如下,
$$ \ phi(t)= 2.num [t] -size [t] $$
分析 $ i $ th $ \ text {table-insert} $ 操作,我们让 $ num_i $ 表示 $ i $ 之后存储在表中存储的项目数th操作, $ size_i $ 表示 $ i $ th操作后表的总大小, $ \ phi_i $ 表示 $ i $ th操作后的潜力。
最初,我们有 $ num_0= 0,size_0= 0 $ , $ \ phi_0= 0 $ 。
如果 $ i $ th表 - 插入操作不会触发扩展,那么我们有 $ size_i= size_ {II} $ 和 $ num_i= num_ {i-1} +1 $ ,操作的摊销成本是 $ \ widehat {c_i} $ 是摊销成本, $ c_i $ 是总成本。
$$ \ widehat {c_i}= c_i + \ phi_i- \ phi_ {i-1}= 3 \ text {(详细信息未显示)} $$ < / p>
如果 $ i $ th操作确实触发扩展,那么我们有 $ size_i= 2。 size_ {i-1} $ 和 $ size_ {i-1}= num_ {i-1}= num_i -1 $ ,也是< / p>
$$ \ widehat {c_i}= c_i + \ phi_i- \ phi_ {i-1}= 3 \ text {(详细信息未显示)} $$ < / p>
现在问题是它们不会对 $ \ widehat {c_1} $ ,首次插入的情况进行计算表中的元素(仅执行代码的1,2,3,10,11)。
在这种情况下,成本 $ c_1= 1 $ , $ \ phi_0= 0 $ 和 $ num_1= size_1= 1 \意味着\ phi_1= 2.1-1= 1 $我们看到 $ \ phi_1= 1 \ tag 1 $
so, $$ \ widehat {c_1}= c_1 + \ phi_1- \ phi_0= 2 $$
但是文本说摊销成本是 $ 3 $ ,(我觉得他们应该说摊销成本是大多数 3美元$ ,从我能理解的)
此外,在下面的图中,文本表示以图形方式表示 $ \ phi_1= 2 $ 哪种矛盾
呃“> $(1)$ ,但根据图表,如果我们假设 $ \ phi_1= 2 $ 那么 $ \ widehat {c_i}= 3,\ forall i $我不太完全弄错的地方。
解决方案
您已在那个流行的教科书中抓住了一个臭名昭着的Off-of-One错误的实例,其名称我们不再提及。
要重复,它是正确的“成本<跨越类=”math-container“> $ c_1= 1 $ , $ \ phi_0= 0 $ < / span>“,” $ num_1= size_1= 1 $ $ \意味着$ $ \ phi_1= 2 \ cdot1-1= 1 $ ”和“ $ \ hat {c_1}= $ $ c_1 + \ phi_1- \ phi_0 $ $= 2 $ “。它是不正确的,说明 $ \ widehat c_i= 3 $ 对于所有 $ i $ 。第一个 $ \ text {t} \ scriptsize {\ text {chable}} \ scimpt \ text {-i} \ scriptsize \ text {nsert} $ 操作确实非常特别。它不被视为扩展,该事件被定义为“执行行5-9的事件”。但是,它不会维护 $ size_i= size_ {i-1} $ 。所以既不是 $ \ widehat {c_i} $ 在教科书中的计算适用于 $ \ widehat {c_1} $ 。
如果我们倾向于信任完全是一个典型的教科书,那么误差是令人困惑的。
另一方面,由于您指出,因此,如此,错误不是非常重要的,因为您指出,它仍然认为“摊销成本最多为3”。顺便说一句,如果您在问题末尾仔细查看图形的图形,它会显示第一个 $ \ text {t} \ scriptsize { \ text {is}} \ small \ text {-i} \ scriptsize \ text {nsert} $ 操作, $ \ phi_1= 1 $ ,正确的值。