缓存标记算法分析

时间:2018-05-28 08:59:50

标签: algorithm

我在解决Kleinberg Tardos“Algoritms Design”一书中关于标记算法的分析时遇到了一些问题。

在关于随机化的章节中,特别是在关于随机缓存(13.8)的章节中,本书介绍了一种称为标记算法的特定算法,可用于管理系统的缓存。 这种类型的算法将内存项的请求序列$ \ sigma $作为输入,并使用不同的阶段处理此请求。每个阶段定义如下:

Each memory item can be either marked or unmarked 
At the beginning of the phase, all items are unmarked 
On a request to item s: 
    Mark s 
    If s is in the cache, then evict nothing
    Else s is not in the cache:
       If all items currently in the cache are marked then 
           Declare the phase over 
           Processing of s is deferred to start of next phase
       Else evict an unmarked item from the cache 
       Endif
    Endif

现在在分析算法时,本书说:

  

为了使分析更容易讨论,我们将在开始和结束时用一些额外的请求“填充”序列σ[...]我们想象在第一个之前发生的“阶段0”阶段,其中最初在缓存中的所有项目都被请求一次。   [...]    我们还想象最终阶段r以一个结尾结束,其中当前在最佳算法的缓存中的每个项目以roundrobin方式被请求两次

最优算法是在给定序列σ的最小未命中数中产生的低位算法。

我有问题要理解为什么这本书做出这个假设。 特别是同一部分以下部分的书中指出:

  

在每个阶段,σ都包含对k个不同项目的访问。后续阶段以访问不同的(k + 1)项开始。

     

标记算法每个阶段最多发生k次失误,在所有r个阶段总共最多kr次。

现在考虑的序列可能(至少对于我已经不知道的)填充的序列,但为什么要使用填充序列而不是正常序列σ??

如果我使用相同的tecnique来证明它也适用于非填充序列,还有一些特殊情况需要考虑吗?

1 个答案:

答案 0 :(得分:0)

  

但为什么要使用填充序列而不是normale序列σ

我会说这只是数学技巧。初始缓存实现需要或多或少的具体时间。现在,填充序列清楚地表明它在0阶段完成,并且不关心在此之前发生的事情。否则你需要反复考虑某个特定项目何时以及为何要缓存。

出于类似的原因,你可能需要结语。说实话,我不知道究竟是为什么,但你应该在算法校对中看到对结语的引用。

基本上你可以计算裸序列和填充序列。从你引用的部分校对中我看到作者发现了一定数量的访问/未命中。用填充序列计算“未命中”更容易,因为它处于可控状态。足够长的序列填充情感是可以忽略的,但没有它?好吧,如果没有它,你就会有一些非常不稳定的“未命中”,无法精确计算。如果没有精确的计算,我们认为不能证明算法的性能。