zoukankan      html  css  js  c++  java
  • 概率算法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

  • 相关阅读:
    kindeditor的使用
    阅读笔记(三)
    阅读笔记(二)
    架构漫谈
    阅读笔记(一)
    hdfs
    暑假周总结八
    暑假周总结七
    暑假周总结六
    暑假周总结五
  • 原文地址:https://www.cnblogs.com/2010Freeze/p/2192736.html
Copyright © 2011-2022 走看看