了解OPT算法

时间:2012-11-12 19:42:02

标签: c++ c algorithm

好的,我正在尝试了解OPT算法,然后它会让我很容易编码。 我不能跟随幻灯片,它没有任何意义。有人可以一步一步地告诉我如何做到这一点吗?

这看起来与LRU算法相同。我们用计数器保留第二个数组吗?

enter image description here

2 个答案:

答案 0 :(得分:2)

您显然必须事先知道将使用哪些页面以及使用的顺序;这是您示例中的列表1, 2, 3, ..., 4, 5。当您必须替换页面时,您选择包含将在所有页面中最后使用的页面的框架。

在此示例中,您可以访问第1,2,3,4,1和2页而不会出现任何页面错误(因为所有页面当前都已交换)。

您的下一页访问权限(第5页)不在任何框架中,因此您必须选择一个框架才能将其放入。根据即将到来的页面匹配(1,2,3,4),第4页(第4帧)将最后被访问,因此您将第5页交换到第4帧(如图所示)。

访问下一页,1,2和3没有任何错误。

现在访问了第4页,但它之前已被换出,因此您有页面错误。您的即将到来的访问列表仅显示第5页,因此可以换出1,2和3中的任何一个。选择1,大概是因为它是第一个。

答案 1 :(得分:0)

最优算法只是一种算法,可以在理论上导致最少的缓存未命中。

换句话说,在之后你知道如何使用缓存之前,不可能知道最佳值。这意味着您不能提前编码算法,这是最佳的;因为,你不知道如何实际使用缓存。

优化算法作为实际算法的基线非常有用。每个非平凡的缓存问题最终都会缓存缺失。了解特定运行的“绝对最小”未命中数可以为比较两种缓存算法提供基线。

例如,如果必须错过缓存四次,那么与错过缓存七次的算法相比,错过缓存六次的算法看起来相当不错。如果你必须错过1000次缓存,那么错过缓存1006次的算法和错过缓存1007次的算法几乎是等效的。

根据缓存的使用模式,某些算法比其他算法更频繁地访问缓存。一个例子是LRU,它将从缓存中删除很少使用的项目:如果你倾向于在一段小时间内对同一个项目进行多次访问,这是很好的。另一方面,如果您需要多次访问每个项目,但是一旦按顺序(如在循环中),则LRU可能具有可怕的性能(~100%缓存未命中),因为每次访问仅从缓存中踢出一个项目。巧合的是,MRU(新项目取代最近使用的)缓存在这些条件下的性能优于LRU,因为至少缓存会对前几个项目执行一次。