论随机化算法的原理与设计

合集下载

第7章_随机化算法

第7章_随机化算法
4
随机化算法概述
一个随机化算法(randomized algorithm)是指 需要利用随机数发生器的算法,算法执行的某些 选择依赖于随机数发生器所产生的随机数。
5
随机化算法
随 机 化 算 法 有 时 也 称 概 率 算 法 ( probabilistic algorithm),但也有人对两者这样区分: 如果取得结果的途径是随机的,则称为随机算法,如拉斯维 加斯算法;而如果取得的解是否正确存在随机性,称为概率 算法,如蒙特卡罗算法。 本书中统一称为随机化算法。
24
蒙特卡罗(Monte Carlo)算法
•如果对于同一实例,蒙特卡罗算法不会给出2个不同的正确解答, 则称该蒙特卡罗算法是一致的。
•有些蒙特卡罗算法除了具有描述问题实例的输入参数外,还具 有描述错误解可接受概率的Байду номын сангаас数。这类算法的计算时间复杂性 通常由问题的实例规模以及错误解可接受概率的函数来描述。
17
舍伍德(Sherwood)算法
No.1
线性时间选择算法
No.2
快速排序算法
这两种算法的核心都在于选择合适的划分 基准。舍伍德算法随机地选择一个数组元素作 为划分基准。
18
舍伍德(Sherwood)算法
有时也会遇到这样的情况,即所给的确定性算法无法直接 改造成舍伍德型算法。
此时可借助于随机预处理技术,不改变原有的确定性算法, 仅对其输入进行随机洗牌,同样可收到舍伍德算法的效果。
27
主元素问题
设T[1:n]是一个含有n个元素的数组。当|{i|T[i]=x}|>n/2时, 称元素x是数组T的主元素。
template<class Type> bool Majority(Type *T, int n) {// 判定主元素的蒙特卡罗算法 int i=rnd.Random(n)+1; Type x=T[i];// 随机选择数组元素 int k=0; for (int j=1;j<=n;j++) if (T[j]==x) k++; return (k>n/2); // k>n/2 时T含有主元素 } template<class Type> bool MajorityMC(Type *T, int n, double e) {// 重复调用k次Majority算法 int k=ceil(log(1/e)/log(2)); for (int i=1;i<=k;i++) if (Majority(T,n)) return true; return false; }

随机化均匀设计遗传算法

随机化均匀设计遗传算法

随机化均匀设计遗传算法随机化均匀设计遗传算法是一种模拟自然选择与遗传进化的数学优化算法,常用于解决复杂难以求解的多变量非线性问题。

其主要应用领域包括机器学习、数据挖掘、智能优化等领域。

下面,就随机化均匀设计遗传算法的几个方面来进行详细的介绍。

一、背景与原理随机化均匀设计遗传算法是在传统的遗传算法的基础上,通过引入均匀设计策略和随机化思想,来提高算法的效率和精度。

该算法原理和基本流程如下:1. 初始化种群:随机产生一批个体,用于初始化种群。

2. 计算适应度:根据适应度函数,对每个个体进行评估。

3. 选择:通过轮盘赌选择、竞赛选择等方法,选出适应度高的个体。

4. 交叉:将选出的个体进行交叉操作,产生新的个体。

5. 变异:对新个体进行突变操作,引入随机性,使种群多样性增加。

6. 更新种群:用新的个体替换掉原来的个体,形成新的种群。

7. 迭代:重复执行2-6步,直至满足停止条件。

二、应用领域随机化均匀设计遗传算法主要应用领域包括:1. 机器学习:通过随机化均匀设计遗传算法,可以对机器学习算法参数进行优化,以提高机器学习的准确性和效率。

2. 数据挖掘:通过随机化均匀设计遗传算法,可以对数据挖掘中的特征选择、分类、聚类等问题进行求解,以提高数据挖掘的效果。

3. 智能优化:随机化均匀设计遗传算法具有全局搜索优化能力,可以应用于各种优化问题,如函数优化、组合优化等。

三、优点与缺点优点:1. 全局搜索能力强:随机化均匀设计遗传算法可以进行全局搜索,避免局部最优解。

2. 自适应性好:由于遗传算法引入了变异和交叉操作,可以使种群自适应性更强,能够在搜索过程中自我调整。

3. 并行计算能力强:随机化均匀设计遗传算法的并行计算能力强,可以应用于高性能计算。

缺点:1. 迭代次数不易确定:由于随机化均匀设计遗传算法的迭代次数取决于停止条件的设置,因此其收敛速度不易预测。

2. 取决于编码方式:随机化均匀设计遗传算法的算法效果与编码方式密切相关,因此需要根据具体问题选择合适的编码方式。

算法设计与分析课件--随机化算法-数值随机化算法

算法设计与分析课件--随机化算法-数值随机化算法
随机化算法是一类基于随机性的算法,包括数值随机化算法、蒙特卡罗算法、拉斯维加斯算法和舍伍德算法等多种类型。其中,数值随机化算法通过引入随机数来求解问题,具有广泛的应用。例如,在计算π的值时,可以通过将n个点随机投向一个正方形,并统计落入内切圆中的点数k,当n足够大时,k与n之比逼近π/4,从而求得π的近似值。类似地,数值随机化算法还可以用于计算定积分点数,可以近似求得定积分的值。这些算法的特点是利用随机数发生器产生随机数,通过随机采样和统计方法来求解问题,具有一定的误差范围,但可以在可接受的时间内给出近似解,特别适用于一些难以通过传统方法求解的复杂问题。

医学实验中的随机化设计原理

医学实验中的随机化设计原理

医学实验中的随机化设计原理随机化设计是进行医学实验的重要原则之一,它可以有效地控制个体差异和其他干扰因素,确保实验结果的可靠性和科学性。

本文将从基本概念、设计方法、实施步骤和质量控制等方面介绍医学实验中的随机化设计原理。

一、基本概念1. 随机化:将受试者或实验单位按照一定的规则随机分组的方法,以避免系统性偏倚和抽样误差,增加实验结果的可比性和可靠性。

2. 实验组与对照组:医学实验通常设立两组,一组接受一定的干预措施(如用药、手术等),称为实验组;另一组不接受干预,作为比较标准,称为对照组。

3. 干扰因素:指实验过程中可能引起误差的相关或不相关因素,如个体差异、疾病程度、治疗次数、药物剂量等。

4. 配对设计:将具备某些特定特征的受试者或实验单位按照一定的规律进行配对,分别随机分到实验组和对照组,以控制干扰因素。

二、设计方法1. 简单随机法:通过随机数字表或随机数发生器等方式,将受试者或实验单位纯随机地分组,以控制系统性偏倚和抽样误差。

2. 分层随机法:依据某一或多个因素,如性别、年龄、病情等,将受试者或实验单位分成若干层,然后在每一层内再进行简单随机分组。

3. 匹配随机法:将具有相同或相似特征的一对受试者或实验单位匹配组合,然后将每一对对随机分配到实验组和对照组。

4. 随机分组前保持设计:在实验开始前,将受试者或实验单位按某一或多个因素进行配对,然后在每一对内随机确定实验组和对照组。

三、实施步骤1. 根据研究目的、病情特征、样本大小等确定假设。

2. 制定实验方案,包括受试者或实验单位的入选标准、干预措施、实验组与对照组的设定以及患者告知同意书等。

3. 随机分组,按照前述设计方法进行随机化分组。

4. 实施干预措施和成组观察,记录实验数据和观察结果。

5. 统计分析,采用适当的统计学方法进行数据处理和分析,验证研究假设。

四、质量控制随机化设计是保证实验结果的科学性和可靠性的重要手段,但在实际操作中仍会出现误差和偏差。

第6章 随机化算法

第6章  随机化算法

第6章 随机化算法
使用拉斯维加斯算法不会得到不正确的解。即一 旦使用拉斯维加斯算法找到一个解,那么这个解 就一定是正确解。但是有时,在使用拉斯维加斯 算法时会找不到解。与蒙特卡罗算法相类似,拉 斯维加斯算法找到正确解的概率随着其所耗费的 计算时间的增加而提高。对于所求解问题的任一 实例,采用同一个拉斯维加斯算法反复对于该实 例求解足够多的次数,可以使得求解失效的概率 尽可能地变小。
第6章 随机化算法 随机化选择算法
在第二章中所叙述的选择算法,是从n个元素 中选择第k小的元素,它的运行时间是20cn, 因此,它的计算时间复杂度为(n) 如果加入随 机性的选择因素,就可以不断提高算法的性能。 假定输入的数据规模为n,可以证明,这个算 法的计算时间复杂度小于4n。以下就是这个算 法的一个具体描述:
第6章 随机化算法
算法6.2 随机化选择算法
输入:从数组A的第一个元素下标为low,最后 一个元素下标为high中,选择第k小的元素
输出:所选择的元素
• template<class Type>
• Type select_random(Type A[],int low,int high,int k)
第6章 随机化算法
6.2 谢伍德(Sherwood)算法
6.2.1 随机化快速排序算法
在第二章中所叙述的快速排序算法中,我们采用 的是将数组的第一个元素作为划分元素进行排 序,在平均情况下的计算时间复杂度为
(n*log n) 在最坏情况下,也就是说,数组中的 元素已经按照递增顺序或者递减顺序进行排列
数值随机化算法常用于数值问题到的求解。这类算法所 得到的解往往是近似解。并且近似解的精度随着计算时 间的增加并且近似解的精度随着计算时间的增加会不断 地提高。在许多情况下,由于要计算出问题的精确解是 不可能的或者是没有必要的,因此用数值随机化算法可 以获得相当满意的解。

数学中的随机算法设计与分析

数学中的随机算法设计与分析

数学中的随机算法设计与分析随机算法是指在算法的执行过程中引入随机性的一种计算方法。

随机算法在计算机科学和数学领域中广泛应用,它能够解决许多与随机性相关的问题,如概率、统计、优化等。

本文将介绍数学中的随机算法设计与分析,并探讨其应用领域和挑战。

一、随机算法的定义和基本思想随机算法是一种通过引入随机性来解决问题的计算方法。

它与确定性算法不同,其执行结果在相同的输入情况下可能会有不同的输出。

随机算法的基本思想是利用随机数生成器生成一系列的随机数,并根据这些随机数进行计算和决策。

随机算法通常包括以下几个步骤:1. 随机数生成:通过随机数生成器生成随机数序列。

2. 初始化:对算法进行初始化,使其获得一个合理的起始状态。

3. 迭代计算:根据生成的随机数和当前状态进行计算,得到新的状态。

4. 终止条件判断:判断是否满足终止条件,如果满足则停止计算,否则返回步骤3。

二、蒙特卡罗方法蒙特卡罗方法是一种以随机采样的方式来解决问题的数值计算方法。

其基本思想是通过随机采样产生问题的一个随机样本,并利用这个样本的统计特征来估计问题的解。

蒙特卡罗方法的应用领域非常广泛,如计算机图形学中的光线跟踪算法、金融工程中的期权定价、物理学中的数值模拟等等。

该方法的优势在于能够处理复杂的数学模型和实际问题,但也存在着计算复杂度高、采样误差等问题。

三、马尔可夫链马尔可夫链是一种随机过程,具有马尔可夫性质。

它的基本思想是当前状态只与前一时刻的状态相关,与之前所有的状态无关。

在随机算法中,马尔可夫链常用于模拟和优化问题。

通过构建一个马尔可夫链模型,可以利用其平稳分布进行采样和估计。

马尔可夫链蒙特卡罗方法以及马尔可夫链蒙特卡罗近似算法是利用马尔可夫链进行随机采样和近似计算的重要技术。

四、遗传算法遗传算法是一种基于生物进化原理的优化算法。

其基本思想是通过模拟生物进化过程中的选择、交叉和变异等操作来搜索最优解。

遗传算法在解决复杂优化问题方面具有很大的优势。

第7章随机化算法

第7章随机化算法

第7章随机化算法随机化算法是一类基于随机性的算法,通过引入随机选择和随机排列等操作,来提高算法的效率和性能。

随机化算法在计算机科学中有着广泛的应用,包括图论、组合优化、概率论等领域。

随机化算法的基本思想是通过引入随机性来改变算法的执行顺序或者策略,从而让算法在平均情况下更快、更高效。

随机化算法的核心是随机选择和随机排列。

随机选择是指在一组元素中随机选择一个元素作为答案。

例如,在一个未排序的数组中找到第K大的元素可以利用随机选择算法来实现。

随机选择算法首先从数组中随机选择一个元素作为基准元素,然后按照基准元素的大小将数组划分成两部分,然后根据划分的结果进行递归操作,直到找到第K大的元素。

随机排列是指将一组元素随机打乱顺序。

例如,在解决图的着色问题时,可以利用随机排列算法将节点随机地进行重新排序,从而减小问题的复杂度。

随机排列算法的核心是通过交换元素的位置来实现打乱顺序的效果。

除了随机选择和随机排列,随机化算法还包括随机重复和随机周期等操作。

随机重复是指多次独立地重复执行同一个算法,并取得多次执行的结果的平均值。

例如,在求解蒙特卡洛方法中,通过多次产生随机数进行模拟计算,并取多次计算结果的平均值,来逼近一个复杂问题的解。

随机周期是指通过设置一个随机的循环周期来改变算法的执行策略。

例如,在解决旅行商问题时,可以利用随机周期算法来寻找更优的解。

随机周期算法首先随机选择一个起始点,然后按照一定的策略选择下一个访问的节点,直到访问了所有节点,并回到起始点。

通过多次随机选择起始点和调整策略,可以得到不同的解。

总之,随机化算法通过引入随机性来改变算法的执行顺序和策略,提高算法的效率和性能。

随机化算法在计算机科学和其他领域中有着广泛的应用,例如优化问题、图论问题、计算机模拟等。

通过合理的设计和应用随机化算法,可以更快、更高效地解决复杂的计算问题。

随机算法原理

随机算法原理

随机算法原理随机算法是计算机科学领域中非常重要的一部分,它被广泛应用于各种领域,包括密码学、模拟、优化等。

随机算法的原理是指通过一定的规则或方法,使得计算机能够生成一系列看似随机的数值或事件,但实际上是按照一定的规律进行的。

在本文中,我们将深入探讨随机算法的原理及其应用。

首先,我们来了解一下随机算法的基本原理。

随机算法的核心思想是通过一定的数学模型或计算方法,生成一系列看似随机的数值或事件。

这些数值或事件在统计意义上表现出随机性,但实际上是可以被计算机所预测和控制的。

这种“伪随机”的特性使得随机算法在各种领域都有着广泛的应用。

其次,我们来探讨一下随机算法的应用。

随机算法在密码学领域中有着重要的应用,比如在加密算法中,随机数被用来生成密钥或者初始化向量,以增加密码系统的安全性。

此外,在模拟和优化领域,随机算法也被广泛应用,比如在蒙特卡洛模拟中,随机数被用来模拟随机事件,以评估复杂系统的性能或行为。

随机算法的原理可以通过各种方法来实现。

常见的方法包括伪随机数生成器、随机抽样、随机排列等。

伪随机数生成器是一种能够生成看似随机数列的算法,但实际上是通过确定性的计算过程生成的。

随机抽样是一种通过从总体中随机选择样本的方法,以估计总体的特征。

随机排列是一种将一组元素随机打乱顺序的方法,以产生一种看似随机的排列。

在实际应用中,我们需要注意随机算法的性能和效率。

随机算法的性能取决于其生成的随机性质,包括均匀性、独立性和周期性等。

而随机算法的效率取决于其计算复杂度和内存消耗等。

因此,在选择随机算法时,我们需要综合考虑其性能和效率,以满足具体应用的需求。

总之,随机算法是计算机科学领域中非常重要的一部分,它的原理和应用涉及到密码学、模拟、优化等多个领域。

随机算法的原理是通过一定的规则或方法,使得计算机能够生成一系列看似随机的数值或事件,但实际上是按照一定的规律进行的。

随机算法的应用包括密码学、模拟、优化等,它在各种领域都有着广泛的应用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

论随机化算法的原理与设计上海市控江中学周咏基[关键字]随机化算法,稳定性[摘要]本文提出了一种新的解决信息学问题的算法——随机化算法,并讨论了其原理与设计方法。

论文首先给出随机化算法的定义,说明了由于“运气”的影响,必须对随机化算法的稳定性进行分析。

然后分“随机不影响算法的执行结果”,“随机影响执行结果的正确性”,“随机影响执行结果的优劣”三种情况,以从基本算法到竞赛试题中用随机化算法有效解决问题的例子,详细分析了三种情况的随机化算法的原理与设计方法。

最后总结出随机化算法的基本原理和共同性质,提出设计随机化算法的一般方法,并指出随机化算法的适用范围和一个有效的随机化算法应具备的特点。

[正文]1.引论在这篇论文中,我们将研究一种新概念的算法——随机化算法。

顾名思义,随机化就是指使用了随机函数。

这里的随机函数不妨是Borland Pascal(或Turbo Pascal)中的RANDOM(N),其返回值为[0,N-1]中的某个整数,且返回每个整数都是等概率的[1]。

一个含有随机函数的算法很可能[2]受到不确定因素的支配。

人们通常认为,一个受到不确定因素支配的算法肯定不是一个有效的算法——正是在这种思维方式的支配下,随机化算法一直被冷落——但是,在接下来的讨论中,我们将看到完全相反的事情发生:对于一些特定的问题,随机化算法恰恰成了十分有效的解题工具,有时甚至比一般的非随机化算法做得更好。

随机化算法的定义随机化算法是这样一种算法,在算法中使用了随机函数,且随机函数的返回值直接或间接地影响了算法的执行流程或执行结果。

根据这个定义,并不是所有的用了随机函数的算法都可称为随机化算法。

例如,某个算法包含i RANDOM(N),但变量i除了在这里被赋予一个随机值之外,在其它地方从未出现过。

显然,如果这个算法没有在其它地方用过随机函数,上面这条语句就无法影响执行的流程或结果,这个算法就不能称为随机化算法。

另一方面,若一个算法是随机化算法,则它执行的流程或结果就会受其中使用的随机函数的影响。

我们按影响的性质和程度分三种情况:1.随机不影响执行结果。

这时,随机必然影响了执行的流程,其效应多表现为算法的时间效率的波动。

2.随机影响执行结果的正确性。

在这种情况中,原问题要求我们求出某个可行解,或者原问题为判定性问题[3],随机的效应表现为执行得到正确解的概率。

3.随机影响执行结果的优劣。

这时,随机的效应表现为实际执行结果与理论上的最优解或期望结果的差异。

第2,3种情况中,随机的影响还可能伴随有对执行流程的影响。

我们后面的讨论就分这三种情况进行。

在讨论之前,我们还要澄清一个问题。

随机化和“运气”由于随机化算法的执行情况受到不确定因素的支配,因此即使同一个算法在多次执行中用同样的输入,其执行情况也会不同,至少略有差异。

差异表现为出解速度快慢,解正确与否,解的优劣等等。

例如:一个随机化算法可能在两次执行中,前一次得到的解较优,后一次的较劣。

现在的问题是:在大多情况中,尤其是竞赛时,对于同样的输入,只允许程序运行一次,根据运行结果判定算法的好坏。

如此一来,我们就会把出劣解的一次运行归咎于运气不佳,反之亦然。

然而,比赛比的是谁的算法更有效,而不是谁的运气更好。

既然我们使用了随机函数,我们就无法摆脱运气的影响,所以我们的目标是尽量将运气的影响降到最低。

也就是说,我们必须使算法的执行情况较为稳定。

因此,在接下来的对算法的分析中,我们将从以下四方面分析算法的性能。

1.时间效率;2.解的正确性;3.解的优劣程度(解与最优解的接近程度);4.稳定性,即算法对同样的输入的执行情况的变化。

变化越小则越稳定。

非随机化算法的稳定性为100%,随机化算法的稳定性属于区间(0%,100%)。

通常,只要算法的程序实现所用的空间不超过内存限制,我们就不必刻意提高算法的空间效率,所以我们省去了空间效率这项分析。

上面第4项的“稳定性”可以是算法的平均时间复杂度,也可以是执行算法得到正确解的概率,还可以是实际解达到某一优劣程度的概率。

“稳定性”这一项是评判随机化算法好坏的一个重要指标。

2.执行结果确定的随机化算法在这一节中,我们以快速排序和它的随机化版本为例,讨论执行结果确定的随机化算法。

根据引言中的分析,一个随机化算法的执行结果确定,则它的执行流程必会受随机的影响,影响多表现在算法的时间效率上。

所以在下面的讨论中,我们省去了对算法执行结果正确性和优劣的分析。

快速排序算法快速排序是一种我们常用的排序方法,它的基本思想是递归式的:将待排序的一组数划分为两部分,前一部分的每个数不大于后一部分的每个数,然后继续分别对这两部分作划分,直到待划分的那部分数只含一个数为止。

算法可由以下伪代码描述。

QUICKSORT(A,lo,hi)1 if lo < hi2 p←PARTITION(A,lo,hi)3 QUICKSORT(A,lo,p)4 QUICKSORT(A,p+1,hi)如果待排序的n个数存入了数组A,则调用QUICKSORT(A,1,n)就可获得升序排列的n个数。

以上的快速排序的算法依赖于PARTITION(A,lo,hi)划分过程。

该过程在Θ(n)的时间内,把A[lo..hi]划分成不大于x=A[lo],和不小于x=A[lo]的两部分。

这两部分分别存入A[lo..p]和A[p+1,hi]。

而在QUICKSORT(A,lo,hi)过程中递归调用QUICKSORT(),对A[lo..p]和A[p+1..hi]继续划分。

可以证明[4],快速排序在最坏情况下(如每次划分都使p=lo)的时间复杂度为Θ(n2),在最坏情况下的时间复杂度为Θ(nlog2n)。

如果假设输入中出现各种排列都是等概率的(但实际情况往往不是这样),则算法的平均时间复杂度为O(nlog2n)。

随机化的快速排序经分析我们看到,快速排序是十分有效的排序法,其平均时间复杂度为O(nlog2n)。

但是在最坏情况下,它的时间复杂度为Θ(n2),当n较大时,速度就很慢(见本节后部的算法性能对照表)。

其实,如果照前面的假设,输入中出现各种排列都是等概率的,那么出现最坏情况的概率小到只有Θ(1/n!),且在Θ()中隐含的常数是很小的。

这样看来,快速排序还是相当有价值的。

但是实际情况往往不符合该假设,可能对某个问题来说,我们遇到的输入大部分都是最坏情况或次坏情况。

一种解决的办法是不用x=A[lo]划分A[lo..hi],而用x=A[hi]或x=A[(lo+hi) div 2]或其它的A[lo..hi]中的数来划分A[lo..hi],这要看具体情况而定。

但这并没有解决问题,因为我们可能遇到的这样的输入:有三类,每一类出现的概率为1/3,且每一类分别对于x=A[lo],x=A[hi],x=A[(lo+hi) div 2]为它们的最坏情况,这时快速排序就会十分低效。

我们将快速排序随机化后可克服这类问题。

随机化快速排序的思想是:每次划分时从A[lo..hi]中随机地选一个数作为x对A[lo..hi]划分。

只需对原算法稍作修改就行了。

我们只是增加了PARTITION_R函数,它调用原来的PARTITION()过程。

QUICKSORT_R()中斜体部分为我们对QUICKSORT的修改。

PARTITION_R(A,lo,hi)1 r←RANDOM(hi-lo+1)+lo2 交换A[lo]和A[r]3 return PARTITION(A,lo,hi)QUICKSORT_R(A,lo,hi)1 if lo < hi2 p←P ARTITION_R(A,lo,hi)3 QUICKSORT_R(A,lo,p)4 QUICKSORT_R(A,p+1,hi)分析随机化快速排序算法随机化没有改动原来快速排序的划分过程,故随机化快速排序的时间效率依然依赖于每次划分选取的数在排好序的数组中的位置,其最坏,平均,最佳时间复杂度依然分别为Θ(n2),O(nlog2n),Θ(nlog2n),只不过最坏情况,最佳情况变了。

最坏,最佳情况不再由输入所决定,而是由随机函数所决定。

也就是说,我们无法通过给出一个最坏的输入来使执行时出现最坏情况(除非我们运气不佳)。

正如引论中所提到的,我们现在来分析随机化快速排序的稳定性。

按各种排列的出现等概率的假设(该假设不一定成立),快速排序遇到最坏情况的可能性为Θ(1/n!)。

假设RANDOM(n)产生n个数的概率都相同(该假设几乎一定成立),则随机化快速排序遇到最坏情况的可能性也为Θ(1/n!)。

如果n足够大,我们就有多于99%的可能性会“交好运”。

也就是说,随机化的快速排序算法有很高的稳定性。

下面是原来的快速排序和随机化后的快速排序的性能对照表。

对以上表格有几点说明:1.程序运行环境为Pentium 100MHz,BP7.0编译。

2.随机化算法的相应程序的运行时间均为1000次运行的平均值。

3.测试随机化算法的稳定性时,相应程序对不同输入各运行了1000次。

4.程序代码见QSORT.PAS。

小结从以上分析看出,执行结果确定的随机化算法原理是:用随机函数全部或部分地抵消最坏输入的作用,使算法的时间效率不完全依赖于输入的好坏。

通过对输入的适当控制,使得执行结果相对稳定,这是设计这一类随机化算法的常用方法。

例如,在随机化快速排序算法中,我们每次随机地选取x来划分A[lo..hi]。

这一方法的效应等价于在排序前先随机地将A中的数打乱。

又如在建立查找二叉树时,可先随机地将待插入的关键字的顺序打乱,然后依次插入树中,以获得较平衡的查找二叉树,提高以后查找关键字的效率。

3.执行结果可能偏离正确解的随机化算法在这一节中我们讨论第2种情况的随机化算法。

这种随机化算法甚至会输出错误的结果,但它依然是很有效的。

我们以判定素数的算法为例。

朴素的素数判定算法对于较小的n,我们可以用“筛数法”判定n是否为素数。

对于稍大一点的n,我们可以先求出[2,⎣sqrt(n)⎦]内的所有素数,再用这些素数试除n。

这两种方法都要借助于大数组,如果n足够大,就不再适用了。

这时,我们只能用2,3,..., ⎣sqrt(n)⎦试除n,一旦除尽,n必然是合数,否则为素数。

算法描述如下:ISPRIME_NAIVE(n)1 for a←2 to ⎣sqrt(n)⎦2 if a|n3 return FALSE4 return TRUE实现时,我们可以先判断n是否为偶数,然后用3,5,7,9,...试除n,以加快程序运行速度。

经管如此,当遇到较大的素数n时,这一算法还是会显得十分慢的。

其最坏情况时间复杂度为Θ(n½)。

随机化的素数判定算法换一个角度,由Fermat定理我们知道:若n是素数,a不能整除n,则a n-1≡1 (mod n)必然成立。

相关文档
最新文档