贪心算法(下)

最优超高速缓存:一个更复杂的交换论证


超高速缓存,是一个一般性的专有名词,在一个快速存储器中存储少量数据以减少与一个慢速存储器的交互而花费的时间

你的办公桌对于校园图书馆相当于超高速存储器

主存对于硬盘

硬盘对于因特网

当你访问某块数据时它总是在超高速缓存里,为此,当需要存入新数据时,用一个超高速缓存维护算法来确定什么时候存在超高速缓存中,什么时候收回

如果超高速缓存满了,我们需要收回某些数据来腾出位置,这叫做超高速缓存缺失,并且我们希望尽可能少出现这些缺失

假如我们三个项{a,b,c},超高速缓存大小是k=2,提供的序列:

                                                                                           a,b,c,b,c,a,b


设计和分析算法


最远将来算法 —by Belady

When di 需要被放入超高速缓存
        收回在最远的将来被需要的那项

S可能不是一个简化调度

Sbar—S的简化,在任何一步i,S放入一个非必需的项d,我们构造的Sbar”假装“也这样,但实际留在主存中,在这之后下一个需要d的步j,再将d放入超高速缓存中

命题.Sbar是一个与调度S放入之多一样多个项的简化调度。

注意到,对任何简化调度,放入的项数恰好为缺失次数

SFF表示由最远将来规则产生的调度

命题:对于某个数j,令S是序列中的前j项与SFF做同样收回决定的简化调度。那么存在一个在序列中的前j+1项与SFF做同样收回决定的简化调度S‘,并且S’不比S产生更多的损失

定理:SFF比任何其他调度不产生更多的缺失,因此是最优的


推广:实际操作下的超高速缓存

Belady的最优算法对于超高速缓存的性能提供了一个基准,但在应用中,人们一般不知道将来需求而匆忙做出收回的决定

经验上,似乎是另一种最近最少使用原则(LRU),这个原则建议人们从超高速缓存中收回最久以前被访问的项

过去的最久而不是将来的最远,因为应用一般都表现访问的局部性



一个图的最短路

某些图的基本运算是基于贪心设计原理的。



问题

图常常用于对网路哦的建模,在网络中从一个点到另一个点的旅行——经过交叉点沿一系列公路的旅行,或者经中介路由器沿一系列通信链路的旅行。

给定结点u和v,什么是最短的u-v路径?什么是s结点到每个结点的最短路径

设计算法

Dijkstra提出一个非常简单的贪心算法求解最短路径问题


Dijkstra算法(G,l)
设S是被探查的结点的集合
对每个u属于S,我们<strong>存储</strong>一个距离d(u)
<strong>初始S={s}</strong>且d(s)=0
While S不等于V
选择一个节点v不属于S,使得S到v至少有一条边并且
d'(v)=min[e=(u,v):u属于S]d(u)+le最小
将v加入S并且定义d(v)=d'(v)
Endwhile

定理,考虑在算法执行中任意一点的集合S,对每个u属于S,路径Pu是最短的s-u路径

归纳易证

实现与运行时间

对于具有n个结点的图,While循环的迭代至多有n-1次。

每次迭代不得不考虑每个结点v不属于S,并检查所有在S与v之间的边以确定最小值min d(u)+le,以便我们可以选出使得这个最小值达到最小的结点v.对于具有m条边的图,计算所有这些最小值可能用o (m)时间,因此这将导致一种实现方法,运行时间为o(mn)

如果使用正确的数据结构,可以做得好很多.

我们对每个结点v属于V-S明确维护最小值d'(v),而不是每次迭代重新计算他们。

将V-S结点保存在一个以d'(v)作为关键字的优先队列里来进一步改进算法的效率。

优先队列:用于维护n个元素的集合,每个元素具有1个关键字,一个优先队列可以有效地插入删除元素,改变一个元素的关键字,以及取出具有最小关键字的元素。我们需要ChangeKey和ExtractMin等操作

1)初始化,d(v)=0,其余=无穷——运算时间o(1)

2)删除最小路径,改变距离为1的结点的关键字(距离)——o(log n)+o(log n)

删除最小路径理论上需要n次,然而算法最多迭代m次,其实在第m次时,多出的点都可以直接全部删除,所以——o(m log n)

因为有m条边,一条边对应改变一次关键字,所以——o(m log n)

操作时间:o(2m log n)=o(m log n)

    原文作者:贪心算法
    原文地址: https://blog.csdn.net/qq_20602929/article/details/50958561
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞