$ \ phi_1= 1 $或$ \ phi_1= 2 $于动态$ \ text {table-insert} $,其中$ \ phi_i $是$ i $ th操作后的潜在函数,根据clrs

cs.stackexchange https://cs.stackexchange.com/questions/128199

以下是通过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 $ ,正确的值。

许可以下: CC-BY-SA归因
不隶属于 cs.stackexchange
scroll top