第6章 随机化算法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
进行排序*/
}
}
/*产生从low到high /*将元素A[k]交换到 /*按照元素A[low]将 /*对第一个子数组进
/*对第二个子数组
第6章 随机化算法
以上这个算法6.1在最坏的情况下,仍然需要的 计算时间复杂度为(n*n) 这是由于随机数产生器 第i次所随机产生的随机选择枢点元素,正好就 是数组中的第i大或者第i小的元素所造成的。但 是,正如以上的算法所述,这种情况出现的可能 性是微乎其微的。实际上,输入元素的任何排列 顺序都不可能使得算法的行为处于最坏的情况。 因此,这个算法的期望运行时间为(n*log n)
c
n 1,2,...
an dn / 65536
第6章 随机化算法
使用以上的这个公式(6.1)可以产生0~65535 的随机数a1,a2,…序列数的程序,有时可以称其 为232步长的倍增谐和随机数产生器。其中,b、 c、d均为正整数,d称为由该公式所产生的随机 序列的种子。常数b与常数c的选取,对于所产生 的随机序列的随机性能有非常大的关系,通常取 b为一素数。
随机化算法有两个优点:首先,随机化算法所需要消 耗的计算时间与空间开销,通常会小于同一个问题的 已知的最好的确定性算法;其次,迄今为止所看到的 所有随机算法,它们的实现都比较简单,也比较容易 理解。
第6章 随机化算法
6.1.1 随机化算法的分类
随机化算法的一个基本特征是对于所求解问题的同一个 实例采用同一个随机化算法求解两次可能得到完全不同 的效果,也就是说,这两次求解所需要的时间甚至所得 到的结果可能会出现相当大的差别。一般情况下,我们 可以将随机化算法大致分为四类,即数值随机化算法、 蒙特卡罗(Monte Carlo)算法、拉斯维加斯(Las Vegas)算法及其谢伍德(Sherwood)算法。
在确定性算法A中,衡量算法A的时间复杂度,是取它 的平均运行时间。如果算法A是一个随机化算法,对于 数据规模大小为n的一个确定的实例I,这一次运行和另 外一次运行,其运行时间可能是不同的。因此,更正常 的衡量算法的性能,是算法A对于确定的实例I的期望运 行时间,也就是说,是由算法A反复地运行实例I,所取 的平均运行时间。因此,在随机化算法里,所讨论的是 最坏情况下的期望时间以及平均情况下的期望时间。
时,计算时间复杂度为 (n*n)
例如,存在一个相当大的经过排序得到的文件, 并在此基础上,如果再附加上一个关键字非常 小的元素之后,再重新对其进行排序,此时, 它的计算时间复杂度就会接近于(n * n)
第6章 随机化算法
出现这种情况的原因,主要是由于第二章中所论 述的快速排序算法采用数组中的第一个元素作为 划分元素进行数组的划分所引起的。此时,由于 数组中的元素已经按照递增顺序或者递减顺序进 行了排列,这样一来,快速排序算法就退化成为 了选择排序算法。如果我们随机地选取任意一个 元素作为划分元素,则快速排序算法的行为就不 会受到数组元素的输入顺序的影响,那么就可以 避免这种情况的产生。这时,所谓的最坏情况, 主要是由于随机数产生器所选择的随机枢点所引 起的。如果随机数产生器所产生的随机枢点序列, 恰好使得所选择的元素序列构成一个递增序列或 者递减序列,就会发生这种情况。但可以认为出 现这种情况的可能性是微乎其微的。
第6章 随机化算法
6.2 谢伍德(Sherwood)算法
6.2.1 随机化快速排序算法
在第二章中所叙述的快速排序算法中,我们采用 的是将数组的第一个元素作为划分元素进行排 序,在平均情况下的计算时间复杂度为
(n*log n) 在最坏情况下,也就是说,数组中的 元素已经按照递增顺序或者递减顺序进行排列
第6章 随机化算法
#define MULTIPLIER 0x015B4F64L; #define INCREMENT 1; static unsigned long seed; void random_seed(unsigned long d) { if(d==0) seed=time(0); else seed=d; } unsigned int random(unsigned long low,unsigned long high) { seed=MULTIPLIER*seed+INCREMENT; return((seed>>16)%(high-low)+low); }
第6章 随机化算法
6.1 随机化算法引言
随机化算法是指在算法中执行某些步骤或者某些动作 时,所进行的选择是随机的。在随机化算法中,除了 接收算法的输入以外,还应该接收一个随机的位流, 以便于在算法的执行过程中,进行随机选择。通常, 将求解问题P的随机化算法定义为:假设I是问题P的 一个实例,在使用算法求解问题I的某些时刻,随机地 选择某个输入b∈I,并且由b来决定算法的下一步动 作。随机化算法将随机性质注入到算法中,改善了算 法分析与设计的灵活性,提高了算法的解题能力。
第6章 随机化算法
知识结构图
数值概率算法
随
谢伍德算法
机
化
算
拉斯维加斯算
法
法
随机化快速排序算 法
随机化选择算法
蒙特卡罗算法
随机化素数检测算 法
第6章 随机化算法
本章最重要的概念是随机化算法的基本概念;本章的另 一个特点就是对于前面章节中使用了确定性算法求解的 问题使用了新的随机化方法提高其求解效率;在本章中, 首先介绍了四种随机化算法——数值概率算法、谢伍德 算法、拉斯维加斯算法及其蒙特卡罗算法的各自特点, 接着,重点介绍了谢伍德算法用于求解快速排序问题、 拉斯维加斯算法用于求解字符串匹配问题以及蒙特卡罗 算法用于求解素数测试问题的基本算法设计思想和设计 方案,最后,分别讨论了使用这些随机化算法的时间复 杂度和空间复杂度。
实际上,计算机并不能产生真正的随机数。当b、 c和d确定以后,由公式(6.1)所产生的随机序 列也就确定了。由于所产生的随机数仅仅只是在 一定程度上的随机而已,因此,有时人们又把这 种方法产生的随机数称为伪随机数。
第6章 随机化算法
以下就是随机数产生器的一个具体例子。其中, 函数random_seed提供给用户选择随机数的种子, 具体说来,当形式参数d=0时,取系统当前的时 间作为随机数种子;当d≠0时,则选用d作为种 子;函数random在给定种子的基础上,计算新 的种子,并且产生一个范围由low及high的新的 随机数。
if(low<high) {
k=random(low,high);
之间的随机数k*/
swap(A[low],A[k]);
数组的第一个位置*/
k=split(A,low,high);
原数组划分成为两个子数组*/
r_quicksort(A,low,k-1);
行排序*/
r_quicksort(A,k+1,high);
在学习本章时,读者特别需要注意的是,引入了这些随 机化方法之后,虽然最终的解不一定在每时每刻都尽善 尽美,但是求解的效率相对于前面使用的确定性算法有 了很大的提高。这就是引入随机化算法讨论的意义与价 值。
第6章 随机化算法
在第1章叙述算法的概念时,曾提到算法的一个特征— —确定性。算法对于所有可能的输入,都必须能够得到 正确的答案。可问题在于,有许多确定性的算法,其性 能很差,也就是说,随着输入数据规模的不断增大,计 算时间复杂度成指数级数的增加,计算效率显著下降。 特别是有许多具有很好的平均运行时间的算法,在最坏 的情况下,却具有很差的性能。于是,出现了采用随机 选择的方法来改善算法的性能。1976年,M.Rabin将这 种新的算法设计方法,称为概率算法。这种算法将“算 法对于所有可能的输入都必须给出正确的答案”这一条 件予以放松,即允许在某些方面,它可能是不正确的。 但是,由于出现这种不正确的可能性比较小,以至于可 以安全地不予理睬。同理,也不要求对一个特定的输入, 算法的每一次运行都能得到相同的结果。增加这种随机 性的因素,所得到的效果是令人惊奇的。尤其是将这种 随机性的因素加入到原来的那些效率很低的确定性算法 中,可以快速地产生问题的解。这种算法通常被称为随 机化算法。
第6章 随机化算法
使用拉斯维加斯算法不会得到不正确的解。即一 旦使用拉斯维加斯算法找到一个解,那么这个解 就一定是正确解。但是有时,在使用拉斯维加斯 算法时会找不到解。与蒙特卡罗算法相类似,拉 斯维加斯算法找到正确解的概率随着其所耗费的 计算时间的增加而提高。对于所求解问题的任一 实例,采用同一个拉斯维加斯算法反复对于该实 例求解足够多的次数,可以使得求解失效的概率 尽可能地变小。
第6章 随机化算法
6.1.2 随机数产生器
正如以上所叙述的那样,在随机化算法中,要随时接收 一个随机数,以便于在算法的执行过程中,按照这个随 机数进行所需要的随机选择。因而,随机数在随机算法 的设计过程中起着非常重要的作用。
在计算机中产生随机数的方法,经常采用下面的公式:
dn
d0 d bdn1
第Leabharlann Baidu章 随机化算法
加入随机选择枢点的快速排序算法,可以按照如 下的算法6.1进行描述:
算法6.1 选择随机化枢点的快速排序算法
输入:数组A[],数组元素的起始位置low,终止 位置high
输出:按照非降顺序排序的数组A[]
template<class Type>
void quicksort_random(Type A[],int low,int high)
第6章 随机化算法
使用谢伍德算法总是可以求得问题的一个解,并且求得 的解总是正确的。当一个确定性算法在最坏情况下的计 算时间复杂度与其在平均情况下的计算时间复杂度有较 大地差别时,可以在这个确定性算法中引入随机性将它 改造成为一个谢伍德算法,消除或者减少问题的好坏实 例间的这种差别。谢伍德算法的精髓并不是避免算法的 最坏情形的行为,而是设法消除这种最坏情形的行为与 特定的实例之间的关联性。
第6章 随机化算法
算法6.2 随机化选择算法
输入:从数组A的第一个元素下标为low,最后 一个元素下标为high中,选择第k小的元素
输出:所选择的元素
• template<class Type>
• Type select_random(Type A[],int low,int high,int k)
数值随机化算法常用于数值问题到的求解。这类算法所 得到的解往往是近似解。并且近似解的精度随着计算时 间的增加并且近似解的精度随着计算时间的增加会不断 地提高。在许多情况下,由于要计算出问题的精确解是 不可能的或者是没有必要的,因此用数值随机化算法可 以获得相当满意的解。
第6章 随机化算法
蒙特卡罗算法用于求出问题的准确解。对于许多 问题来说,近似解毫无意义。例如,对于一个判 定问题,其解为“YES”或者“NO”,二者必居其 一,不存在任何近似解答。又如,要求一个整数 的因子时所给出的解答必须是准确的,一个整数 的近似因子本身是没有任何意义的。尽管使用蒙 特卡罗算法可以求得问题的一个解,但是这个解 未必就是正确的。其求得正确解的概率必须依赖 于算法所消耗的时间。即算法所耗费的时间愈多, 得到正确解的概率就愈高。蒙特卡罗算法的缺点 也恰恰在于此。即在一般情况下,无法有效地判 定所得到的解是否肯定正确。
第6章 随机化算法 随机化选择算法
在第二章中所叙述的选择算法,是从n个元素 中选择第k小的元素,它的运行时间是20cn, 因此,它的计算时间复杂度为(n) 如果加入随 机性的选择因素,就可以不断提高算法的性能。 假定输入的数据规模为n,可以证明,这个算 法的计算时间复杂度小于4n。以下就是这个算 法的一个具体描述:
{
random_seed(0); 作为随机数种子*/
/*选择系统的当前时间
r_quicksort(A,low,high); 速排序算法*/
/*递归调用随机快
}
void r_quicksort(Type A[],int low,int high)
第6章 随机化算法 {
int k;