• 随机化算法概述


    举例
    例一
    下面,我们就随机化问题,举一个例子:
    一个长度在4..10的字符串中,需要判定是否可以在字符串中删去若干字符,使得改变后字符串符合以下条件之一:
    (1)AAAA;(2)AABB;(3)ABAB;(4)ABBA。
    例如:长度为6字符串“POPKDK”,若删除其中的“O”,“D”两个字母,则原串变为:“PPKK”,符合条件(2)AABB。
    分析:
    这道题很容易想到一种算法:运用排列组合:枚举每4个字母,然后逐一判断。算法是可行的,但是如果需要题目中加上一句话:需要判断n个字符串,且n<=100000,那么这样的耗时是不能让人忍受①的,因为在枚举的过程中,是非常浪费时间的。
    (①:这里是指信息学中要求算法的普遍运算时间为:1000ms)
    所以这道题有可能可以借助于随机化算法,下面我们来算一下在10个字符中取4个字符一共有多少种取法:C(4,10)=210。那么很容易得知,随机化算法如果随机300次,能得到的结果基本上就正确了(概率为1-(209/210)^300,约为0.76),而随机时的时间消耗是O(1),只需要判断没有随机重复即可,判重的时间复杂度也为O(1),并且最多随机300次,这样就可以有效地得到答案,最大运算次数为:O(300n),这是在计算机的承受范围内(1000ms)的。
    从这里就能看出,随机化算法是一个很好的概率算法,但是它并不能保证正确,而且它单独使用的情况很少,大部分是与其他的算法:例如贪心、搜索等配合起来运用。
    例二
    排序问题。快速排序是排序方法中较为便捷的方法之一,但是由于它极不稳定,最好的时候时间复杂度为O(n㏒n),这里的㏒是指以2为底的对数运算。最坏的时候能达到与普通排序方法一样的O(n^2)。
    而制约快速排序的有两个:一是数据,越无序的数据,快排的速度越快;二是中间点的枚举。
    因为两个制约条件都与随机有着不可分开的关系。
    所以,在快速排序中加入随机化算法无疑是十分重要的。
    运用在:
    (1)数据读入时,随机排放数据位置。
    (2)中间点的枚举进行多次随机化后决定。
    这样就基本上将快速排序的时间复杂度维持在最好状态。[1]

  • 相关阅读:
    1024程序员节——我是猿,我为自己带盐
    STM32FreeRTOS任务通知(STM32cube高效开发)
    【力扣白嫖日记】626.换座位
    ADSO的Remodeling
    深度神经网络模型有哪些,深度神经网络预测模型
    ChinaSoft 论坛巡礼 | 安全攸关软件的智能化开发方法论坛
    打开时空隧道,重演云栖72小时云世界
    WEB安全之PHP基础(九):正则表达式
    list转map
    峰会实录 | StarRocks PMC Chair 赵纯:数据分析的极速统一3.0 时代
  • 原文地址:https://blog.csdn.net/s13596191285/article/details/127897557