概率算法-Las Vegas

为了便于理解,构造一个问题。

假设一个问题的解是由n个部分构成,n>1即y={x1,x2,...,xn}。为了描述方便我把xi(i=1,2...n)称为解y的元素,简称解元素。

每个解元素之间不是相互独立的,它们之间都可能存在某种约束。

在求解问题时一般有两种方法:

1数学法(规律法) 比如解线性方程组 时采用代数方法。

2穷举法 比如解线性方程组 时采用穷举法。

第一种方法本文不考虑,穷举法是很直观的算法,但一般复杂度较大。

Las Vegas 一般就是针对穷举法(不排除其它可能,事实上,只要存在一个范围,在这个小范围里使用了穷举思想,都可以考虑改进)

变穷举为随机

x1随机产生,结合约束条件,在选定x1后可能可以排除部分考虑值,使得x2的随机选择范围缩小,依此类推一直到xp,从xp以后都恢复使用穷举。

为了便于分析复杂度,假设每个xi的取值范围都是1到m的整数(常见的循环结构)

其中f(p)是随机选择p个解元素所消耗复杂度。如果f(p)约为m^p的话,可知当m^n-p=m^p即p=n/2时,复杂度最小为O(m^n/2)。

理论上p=n/2时,是最优的,但在具体实际中,还要考虑代码复杂度,设想一下这么多约束的排除需要多写多少代码。

事实上在p<=n/2的情况下,p每多一个复杂度降一级,当p=1时算法复杂度就是O(m^n-1)了,总之这个度要根据具体约束情况把握了。

Las Vegas算法特点

 不一定每次都能返回解,如果解的个数不唯一的话,不一定返回所有解,但不排除理论上通过多次执行求的全部的解。这就注定它不适用于每一种情况。

Las Vegas应用

教材中的应用实例给的是N皇后问题,参考http://www.cnblogs.com/tanky_woo/archive/2010/12/13/1904146.html

这个例子用了面向对象,显得有些杀鸡用宰牛刀的味道,而且编译貌似有问题。

可以参考我的一个实现源码http://www.cnblogs.com/2010Freeze/archive/2011/11/04/2235937.html

 

你可能感兴趣的:(算法)