算法设计学习笔记(十三)随机化算法


前言

本文是对于算法设计的学习笔记,如有错误,请不吝赐教。

随机化和概率分析涉及计算机科学的许多领域。
我们在计算机中考虑随机化方法时,通常有两种不同的方式。
第一种看法认为世界的行为是随机的,传统的算法面临随机产生的输入。这种方法通常被称作平均情况分析。(考虑算法对平均输入而不是最坏输入的行为)
第二种看法认为算法的行为是随机的。世界永远提供相同的最坏情况的输入,但允许算法在处理输入时做随机的决定。于是这种方法中,随机化的角色纯粹是算法内部的。这是我们本章需要考虑的随机化算法的概念。
我们可以知道有效的确定算法是随机算法的模型,后者只需要有效地以很高的概率给出正确答案即可,内部随机化的算法也能够削弱某些最坏情况的现象,同样对于那些没有有效的确定算法的问题也能够用随机算法解决。


一、第一个应用:消除争用

在这一节,我们考虑随机算法的第一个应用——在分布式系统中消除争用。

1.1 问题

假设有n个进程P1,P2,P3…Pn,这些进程争着访问一个共享的数据库,同时数据库在一个周期内最多能够被一个进程访问,如果有两个或者两个以上的进程要同时访问它,那么在这个周期内所有的进程都被关在外面。在这里我们假设进程间难以通讯,那么我们要考虑一种方法来使得进程按照某个协议来轮流访问数据库。

1.2 设计一个随机算法

在这里我们考虑随机化。我们可以简单规定独立的数P,>0,每个进程在一个周期内以p的概率访问数据库,在一组相同的进程中的每一个随机化他们自己的策略就是打破对称性的核心。我们通过随机化来消除争用。

1.3 分析算法

我们考虑在这算法中的一些事件。
我们考虑对于给定的进程pi和给定的周期t,我们用x[i,t]表示事件Pi在周期t中访问数据库。
由此可知这个事件的概率为Pr[x[i,t]]=p,我们同样定义一个补事件来表示这个事件不发生也就为1-p

此时我们考虑一个进程在给定的周期中访问数据库是否成功。我们用y[i,t]来表示这个事件。
由此我们可以知道该事件就是如下:
在这里插入图片描述由于这些事件都是独立的,那么可以得到如下:

在这里插入图片描述我们现在考虑p取什么值能够使得这个成功率最大。可以发现当p=1或者=0时成功率都为0.我们考虑该函数的导数等,可以发现p=1/n时达到最大值。
在这里插入图片描述由此得到
在这里插入图片描述所以渐近地等于O(1/n)

现在让我们考虑带有p=1/n的协议,它使得进程pi最多多少时间成功一次。
在这里插入图片描述我们考虑渐近值:在一个周期内的成功概率为O(1/n)
在这里插入图片描述此时如果令t=en
那么可得如下:
在这里插入图片描述由此可知如果把t放大适当小的倍数,那么Pi在1到t的任何周期都不成功的概率会急剧下降。我们令t=在这里插入图片描述
在这里插入图片描述此时可知在n个周期后,不成功的概率不超过一个常数,在nlnn周期后不超过n的多项式的倒数。

最后,我们要考虑在以高概率每一个进程至少访问一次数据后之前必须好用多少周期?
此处我们假设协议在t个周期后失败,如果有某个进程还没有成功访问数据库的话。
我们的目标是找个合理的t值使得在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

二、求完全最小割

在上述例子中,随机化是自然提出的,现在考虑一个用随机方法的图论问题。

2.1 问题

我们给定一个无向图G=(V,E),我们定义G的割是把V分成两个非空集合A和B的划分。对于无向图G中的割(A,B),(A,B)的大小时一个端点在A中,另一个端点在B中的边的条数。
完全最小割时大小最小的割。(完全的意思是对于任意的图的割。他是使得图不连通所需要删去的最少的边数)
我们可知如果要找一个完全最小割,那么网络流算法便可以实现。
在这里插入图片描述
证明如下:我们考虑将无向图改为有向图,我们对于无向图的每条边都变成两条容量为1的相反的边。同时我们固定一个点s,对于其他的t计算它的最小割。这就相当于一个n-1个有向最小割的计算。(s点一定属于两个集合中的一个)

2.2 算法设计

我们现在考虑一个对于该问题同样有效的随机化算法——收缩算法。
我们先考虑一个最简单的收缩算法。
收缩算法对连通的多重图G=(V,E)进行操作,所谓多重图是允许在同一对节点间有多条平行的边的无向图。
收缩算法在开始时等可能的选择G的一条边(u,v)收缩它。
所有收缩的意思是生成一个新的图G‘,在G’中把u和v看作一个新的节点,其他的所有节点保持不变,同时从G’中删去一个点是u,另一个点是v的边。
过程可见下图;
在这里插入图片描述
收缩算法在只剩两个超节点时终止,以这两个节点作为划分。

算法的具体描述如下:

应用于多重图G=(V,E)的收缩算法
for 每一个节点v,记录已经收缩进v的节点集合Sv
   初始化每个v是的Sv=v
 if G只有两个节点, then 
  returnelse 等可能的选取一条G的边
 设G'时收缩e所得到的图
 令 S(w)=su+sv
 递归使用收缩算法
 endif

2.3 算法分析

由于算法要随机选择,所以有一定的成功率和失败率。这个算法成功的概率是多项式的小,然后通过运行多项式次计算返回在所有运行中得到的最好的割,实际上能够以很高的概率产生完全最小割。
在这里插入图片描述
证明:假设G的完全最小割的大小为k,我们可知每个点的度至少为k,由此可得以下:
收缩F中的一条边的概率:(F是一个点在A,另一个点在B的边的集合,对应最小割)
在这里插入图片描述
在j次迭代后,图G1中有n-j个点,我们可知G1中至少有1/2k(n-j)条边。由此可得在j+1次的收缩F中的一条边的概率。
在这里插入图片描述
由此我们可得到在每一次迭代中都不收缩F中的边的概率,最后得证。
如果我们对于收缩算法运行多次例如如下;
在这里插入图片描述

那么每一次都没有找到最小割的概率不超过:
在这里插入图片描述

2.4 进一步的分析:完全最小割的个数

收缩算法对于问题:给定n个节点的无向图G=(V,E),它可能有的完全最小割的最大个数是多少有着简单的回答。
在这里插入图片描述
具体证明如下:
在这里插入图片描述

三、随机变量机及其期望

为了能够做更加定量的分析我们需要随机变量这个概念。
给定概率空间,随机变量X是一个从样本空间到自然数的函数,是的对每个自然数j,所有取值j的样本点的集合X^-1(j)是一个事件。
给定随机变量X,我们常常对确定它的期望X取到的平均值感兴趣。
我们把期望定义为如下概念:
在这里插入图片描述

3.1 例:等候第一次成功

我们考虑有一枚硬币,正面向上的概率为p>0,反面向上的概率为1-p。掷硬币的结果是独立的,如果掷硬币直到第一次得到正面为止,要投的期望次数是多少,由此我们考虑令随机变量X等于投硬币的次数,对j>0,
在这里插入图片描述
在这里插入图片描述

3.2 期望的线性

在这里插入图片描述
即X,Y是独立的。

3.3 例:猜牌

我们考虑问题如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.4 例:收集优待卷

在这里我们考虑一个简单的例子如下:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
加粗样式

3.5 最后一个定义:条件期望

我们可以定义随机变量在某个事件条件下的期望:
在这里插入图片描述
(只需用条件太绿替换期望定义中的概率即可)

四、MAX 3-SAT的随机近似算法

在上节我们看到用期望的线性性分析随机过程的集中方法。我们现在考虑用这种思想来设计近似算法。

4.1 问题

我们在这里把3-SAT实例转换为最优化问题:给定一组输入子句C1…CK,要满足一个尽可能多子句的真值赋值。(最大三元可满足性问题)

4.2 设计和分析算法

我们考虑一个非常简单的随机算法:
我们独立地以概率1/2令每一个变量x1.。。xn等于0或者1,那么被这样一个随机赋值满足的子句的期望数是多少?

我们假设随机变量 Z表示满足的子句数,E[Zi]表示Ci被满足的概率,那么可得Ezi=7/8
在这里插入图片描述
在这里插入图片描述

补充:
在这里插入图片描述

4.3 进一步的分析:等待找到一个好的赋值

假设如果我们不满足只产生一个具有满足子句期望数大的赋值的一次性算法,而想要一个具有多项式期望运行时间并保证输出一个至少满足所有子句的7/8的随机算法。
最简单的方式是生成随机赋值直到满足子句的7/8为止。
那么做到这一点需要多少时间呢?
我们考虑期望。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其中k’是严格小于7/8的最大的自然数
在这里插入图片描述

五、随机分治策略:求中位数与快速排序

分治策略于随机化结合起来常常非常好用,我们将在下述问题中看到这一点。

5.1 问题:求中位数

假设给定n个数的集合S,它们的中位数是将他们排序后位于中间位置的数。这里我们假设所有的数是不同的。

5.2 设计算法

1.基于划分元素的一般算法:为了获得线性的期望运行时间,我们考虑一个更一般的问题:给定n个数的集合S和1-n之间的一个数k。考虑Select(S,K)返回从小到大第k个元素。
在这里我们选择一个元素ai作为划分元素,并构成集合{aj:aj<ai} 和集合 {aj:aj>ai},然后我们考虑在那个集合中包含第k个元素,并在这个集合上迭代。

算法如下:

Select(S,k)
选择一个元素ai属于S
for s的每一个元素aj
 如果 aj<ai 则把aj放入s1
 否则放入s2
endfor
if|s1|>=k then
 从小到大第k个元素在s1中
 递归调用Select(s1,k)
else |S2|=l<=k-1
  递归调用Select(S2,K-1-L)
endif

选择一个好的划分:
我们考虑Select的运行时间如何依赖于选择划分元素。
如果我们能够用中位数作为划分元素,那么此时Tn=On
如果我们选择恰当的元素那么同样也能得到较好的性能。

在这里我们考虑等可能的随机选择一个划分元素ai

5.3 分析算法

在这里插入图片描述
具体证明可见P511(中心元素,期望迭代步骤)

5.4 第二个应用:快速排序

我们对于求中位数的随机分治策略也是排序算法Quicksort的基础。
在这里我们考虑Quicksort算法
算法描述如下:

Quicksort(S)
if|S|<=3 then
排序 S
else
等可能的随机选择一个划分元素ai属于S
    for  S的每一个元素aj
    如果aj<ai 把aj加入S1
    否则加入S2
    endfor
递归调用quicksort(s1),quicksort(s2)
endif

为了能够得到更好的分析,我们稍作修改,仅当找到一个中心划分元素时才进行递归调用。

算法如下:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六、散列法:字典的随机实现

随机化还被证明时设计数据结构的有力技术,在这里我们滔铝散列法的技术。这是随机化在这个领域中的最基本应用,它可以用来维护动态变化的元素的集合。

6.1 问题

我们考虑字典这个数据结构的定义:
在这里插入图片描述
在这里插入图片描述

6.2 设计数据结构

散列函数:散列法的基本思想是使用大小为|S|的数组。
选择一个好的散列函数:

在这里插入图片描述
通用散列函数类:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.3 分析数据结构

在这里插入图片描述

在这里插入图片描述

七、求最邻近点对:一个随机方法

这里我们考虑利用随机化算法来开发针对这个问题的另一种算法,它使用基础的字典数据结构。

7.1 问题

问题的描述如下:
在这里插入图片描述

7.2 设计算法

算法的基本思想如下:按照随机的顺序考虑这些点,并维护一个表示按照这个村里处理点时的最邻近点对的当前值x,当我们碰到一个新点p,看是否有前面一斤考虑过的点与p的距离小于x,如果没有那么就没有过变化。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
具体算法如下:

按照随机序列p1..p2..pn处理点
用x表示至今发现的最小距离
初始化x=d(p1,p2)
保存边长为x/2的子正方形,调用MakeDictionary
for i in 1,n
确定包含pi的子正方形Sn
查找靠近pi的25个子正方形
计算从pi到这些子正方形中找到的每一个点的距离
if 有一个点pi 是的距离小于x then
删除当前字典
保存新的子正方形 调用 MakeDictionary
for p1,p2,,pi 
确定包含它边长的子正方形
把这个子正方形插入新字典
endfor
else
把pi插入当前的字典
endif
endfor

7.3 分析算法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.4 实现线性期望运行时间

上述过程中,我们把字典结构看作一个黑盒子,现在希望给出实际的期望运行时间的界限。
为了实现字典,我们采用通用散列的方式。
在这里插入图片描述
在这里插入图片描述
事实上,能够用更加复杂的散列函数来把算术运算次数减少到On,有另一类通用散列函数能够仅用O1次算术计算来计算散列函数值。我们可以通过这些方式来是的算法达到On的期望运行时间。

八、随机超高速缓存

我们现在考虑对于超高速缓存问题使用随机化。我们开发一个算法称为标记算法,它包括确定的方法也包括随机的方法。

8.1 问题

问题具体可见第四章。
在第四章中我们看到一个贪心算法的策略:最远将来策略。虽然这个策略是有效的,但是在现实的运算条件下它无法实现。在现实中,我们往往使用LRU算法。

8.2 设计标记算法类

LRU及其随机版的界限都来自与设计在线收回策略的一种通用模板——称作标记算法的一类策略。他们收到下述的启发。回收策略主要应对下述的两种可能性:1.请求序列包含k个以上的不同项
2.请求序列仅仅来自一个不超过k项的集合。

每一个存储项都是标记的或者未标记的
在本阶段开始,所有的项都是未标记的
对项s的一个请求:
标记s
if s在超高速缓存器中 then 不回收任何项
else s不在超高速缓存器中
 if 超高速缓存器中所有的项都是标记的 then
   本阶段结束
   把s的处理推迟到下一个阶段的开始
   else 从高速缓存中收回一个未标记的项
 endif

上述所描述的是一类算法,主要因为关键的步骤即标记的规则未给出。

有上述我们可知对于未标记的项在最近访问的次数一定比标记的项少。所以可得LRU(最近最少被访问)策略是一种标记算法。

8.3 分析标记算法

在这里插入图片描述标记算法在一个阶段中对于一个项至多招致一次失败。由此可得以下结论:
在这里插入图片描述在这里插入图片描述证明:我们考虑除了最后一个之外的任意一个阶段。我们可知这个阶段的剩余部分需要访问k-1个其他不同的项,并且下一个阶段的第一次访问还涉及到第k个另外不同的项,那么可知对于每一个阶段j<r,最优算法从阶段j中的第二次访问到阶段j+1中的第一次访问至少有一次失败,所以总共有r-1次失败。
在这里插入图片描述那么对于LRU算法,每一次回收的项恰好是下一步所需的项,俺么每一次访问都招致一次缓存失败,所以可知LRU的失败次数是最优策略的k倍。

8.4 设计一个随机标记算法

上述是一个LRU的坏例子,所以如果对于在线缓存算法需要有更好的界限,那么我们需要一个随机标记算法。
随机化选择是一个很好地方式来避免得到坏例子中的不幸选择。

我们考虑在高速缓存中等可能的随机回收一个未标记的项。

8.5 分析随机标记算法

在这里插入图片描述证明:在这里插入图片描述我们现在考虑随机标记算法导致的期望失败数的上界。
在这里插入图片描述其中M 表示随机标记算法在请求序列a 上招致的缓存失败数。

在这里插入图片描述证明可见P530

九、Chernoff界

我们考虑随机变量X偏离Ex的概率的界限。
在这里插入图片描述在这里插入图片描述具体证明见P531

这表示X不太可能在上面偏离它的期望太远,同时X不太可能在下面偏离它的期望太远。(记住定理而非证明)

十、负载均衡

我们在这里考虑之前考虑过的负载均衡的问题,我们之前考虑在进程之间通信困难的分布式系统,并用某种程度的随机化来代替明显的协调和同步。现在我们考虑另一种风格的随机化。

10.1 问题

假设在一个系统中有m项任务先后到达需要立即处理,我们有n台相同的处理机能够执行这些任务。因此我们的任务是把每一项任务分配给一台处理机使得各台处理机之间的工作负载是均衡的。
可知如果有一台中心控制器能够接受每一项任务并循环的把它分配给处理机,那么就能保证处理机的平衡。同样的,如果我们考虑将任务等可能的分配各一台处理机,那么也能做到这一点。

10.2 分析随机分配

我们假设随机变量X等于分配给处理机i的任务数,i=1,2,n。
在这里插入图片描述在这里插入图片描述在这里插入图片描述具体证明见P534

十一、包路由选择

我们在这节中考虑包路由选择,以说明随机化能够如何减少分布式系统中的竞争。

11.1 问题

包路由选择是支持大型网络节点之间通信的一种机制,可以用有向图G=(V,E)作为网络的模型。节点S将数据传送到T那么这个数据被分成一个或者几个包。然后通过网络中的一条s-t路径P来传送每一个包。同时我们对边e有一个限制即在一个时间步内只能传送一个包。
比如如下:
在这里插入图片描述我们在这里要考虑的是对每一条边e的排队管理策略即每一个时间步如何从e的队列中选择下一个传输的包。这些包的调度决策会对所有包抵达它们的目的地的总时间产生大量影响。

我们把直到每一个包都到达它的目的地所经过的步数称作调度的传输期,目标是找到一个传输期最小的调度。

我们定义路径集合P1P2…PN的张度d为这些路径的最长长度,这个路径集合的阻塞度C为它们共有一条边的最大路径树。那么传输期至少为max(c,d)=Ω(c+d)

11.2 设计算法

一个简单的随机调度:
如果每一条边在每一步简单的传输一个任意等待的包,那么可知调度的传输期为O(cd).(因为一个包在它的路径上的的条边中的每一条都可能被另外c-1个包阻塞)

为了缩小这个界限,我们考虑引入某种随机化。
我们考虑随机地移动从各自源点释放包的时间。

每一个包i如下行动:
i选择一个1到r之间的随机延迟
i在它的源点等待s时间步
然后i全速向前移动,每一时间步通过一条边,直至抵达它的目的地为止

该算法如果没有两个包的碰撞,那么将是O(r+d),但是除非r取得特别大,很有可能有两个包在某个点发生碰撞。
为了解决以上,我们考虑对该策略的推广:

对于参数b,把连续的b个时间步合成一个时间段
对每一个包i如下行动:
i选择一个1到r之间的随机延迟
i在它的源点等待s段时间
然后i每一时间段向前通过一条边,直至抵达它的目的地为止

只要不遇到极端类型的碰撞,那么这个算法就能充分消除碰撞。
在这里插入图片描述

11.3 分析算法

考虑用和时间的方式来得到结论。
我们假设e是一条边,t是1到r+d之间的一个时间段。
在这里插入图片描述具体证明见p538

十二、背景:某些基本概率定义

12.1 有限概率空间

在这里插入图片描述

12.2 条件概率与独立性

在这里插入图片描述在这里插入图片描述

12.3 和事件的界限

在这里插入图片描述在这里插入图片描述

使用情况:在这里插入图片描述

12.4 无限样本空间*

一般的概率空间
在这里插入图片描述无限样本空间
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43869415/article/details/118977470