算法设计与分析-第七章随机算法及计算复杂性
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7.3 随机数发生器
产生随机数的公式:
d0 dn
d bdn1c
an dn/65536
n1,2,
产生0~65535的随机数 a1,a2, 序列,
b、c、d为正整数,称为所产生的随机序列的种子。
常数b、c,对所产生的随机序列的随机性能有很大的 关系,b通常取一素数。
7.3 随机数发生器
#define MULTIPLIER 0x015A4E35L;
}
return 4*k/(double)n;
}
7.5 舍伍德(Sherwood)算法
一、确定性算法的平均运行时间 TA(x) :确定性算法对输入实例的运行时间。 Xn :规模为的所有输入实例全体。
算法的平均运行时间:TA(n) TA(x)/|Xn|
存在实例 x Xn,TA(x)TA(n)x Xn。
{
seed = MULTIPLIER * seed + INCREMENT;
return ((seed >> 16) % (high – low) + low);
7.4 数值概率算法
例:用随机投点法计算值 设有一半径为r的圆及其外切四边形。向该正
方形随机地投掷n个点。设落入圆内的点数为k。 由于所投入的点在正方形上均匀分布,因而所 投 足入 够的 大点 时落 ,入k与圆n内之的比概就率逼为近这一概4rr率。22 。所4 从以而当n
7.6 拉斯维加斯(Las Vegas)算法
一、一般概念 拉斯维加斯算法有时运行成功,有时失败,需 要反复运行同一实例,直到成功为止。
BOOL las_vegas():解问题的某个实例的代码段。 运行成功返回true,否则返回false。
拉斯维加斯算法反复地运行下面的代码段: while(!las_vegas(P(x))) ; 直到运行成功返回为止。
算法9.7 求数组A的主元素 输入:n个元素的数组A[] 输出:数组A的主元素
BOOL majority(Type A[],Type &x,int n) { int i,j,k;
random_seed(0); i = random(0,n-1) ; k = 0;
for (j=0;j<n;j++) if (A[i]==A[j]) k++;
7.5 舍伍德(Sherwood)算法
1. void r_quicksort(Type A[],int low,int high)
2. {
3. int k;
4. if (low<high) {
5. k = random(low,high);/* 产生low到high之间的随机数k */
6. swap(A[low],A[k]);/* 把元素A[k]交换到数组的第一个位置*/
例:识别重复元素 考虑一个有n个数字的数组a[],其中有n/2个不
同的元素,其余元素是另一个元素的拷贝,即 数组中共有(n/2)+1个不同的元素。问题是 要识别重复的元素。 确定性算法:
至少需要(n/2)+2个时间步。
7.6 拉斯维加斯(Las Vegas)算法
拉斯维加斯(Las Vegas)算法
如果对于同一实例,蒙特卡罗算法不会给出2 个不同的正确解答,则称该蒙特卡罗算法是一 致的。
7.7 蒙特卡罗(Monte Carlo)算法
数组的主元素问题 一、问题
n个元素的数组A,A中元素x,若A中一半以上元素 与x相同,称x是A的主元素。
例:序列1,3,2,3,3,4,3中,元素3是主元素。
7. k = split(A,low,high); /* 按元素A[low]把数组划分为两个 */
8. r_quicksort(A,low,k-1);
/* 排序第一个子数组 */
9. r_quicksort(A,k+1,high); /* 排序第二个子数组 */
10. }
11. }
算法的期望运行时间是 (nlogn) 。
7.7 蒙特卡罗(Monte Carlo)算法
蒙特卡罗算法则在一般情况下可以保证对问题 的所有实例都以高概率给出正确解,但是通常 无法判定一个具体解是否正确。
设p是一个实数,且1/2<p<1。如果一个蒙特 卡罗算法对于问题的任一实例得到正确解的概 率不小于p,则称该蒙特卡罗算法是p正确的, 且称p-1/2是该算法的优势。
第七章 随机算法及NP完全问题
7.1 随机算法引言 7.2 随机算法的类型 7.3 随机数发生器 7.4 数值概率算法 7.5 舍伍德(Sherwood)算法 7.6 拉斯维加斯(Las Vegas)算法 7.7 蒙特卡罗(Monte Carlo)算法 7.8 NP完全问题
7.1 随机算法引言
while循环则任何一次迭代中退出的概率为
p=
n 2
(n 2
1)
.当n
≥
10时,
p
≥
1/5,则不退出的
n2
概率≤ 4/5。
算法在前calogn(c为固定常数)次迭代内不退出的 概率<(4/5) calogn=n-calog(4/5),若取c ≥ 1/log(5/4),则 其值< n-a,
因此,算法在calogn次迭代以内终止的概率≥ 1n-a。每次迭代花费O(1)的时间,算法的执行时间 为O(logn)。
例:快速排序算法 当输入数据均匀分布时,运行时间是 (nlogn)。 当输入数据按递增或递减顺序排列时,算法的运行时
间变坏
7.5 舍伍德(Sherwood)算法
二、舍伍德算法的基本思想
– 消除不同输入实例对算法性能的影响,使随机算法对 规模为的每一个实例,都有:T B(x)TA(n)s(n)
if (k>n/2) {x = A[i]; return TRUE;} else return FALSE; }
7.7 蒙特卡罗(Monte Carlo)算法
2、如果存在主元素,以大于1/2的概率返回 true,小于1/2的概率返回false。
连续运行k次,返回的概率减少为2-k,算法错 误的概率为2-k 。
是(n-1)! -1(mod n)。
费尔马小定理:如果p是一个素数,且0<a<p,则ap-1(mod p)。
二次探测定理:如果p是一个算素法数p,ri且m0e<是x<一p个,偏则假方3程/4x正2确1(的mo蒙d p)
的解为x=1,p-1。
特卡罗算法。通过多次重复调用错
int power(int a, int p, int n)
7.6 拉斯维加斯(Las Vegas)算法
p(x):对输入实例成功地运行las_vegas的概 率
若存在常数δ>0,使得对的所有实例p,都有 p(x)>= δ ,则失败的概率小于1- δ 。
连续运行k次,失败的概率降低为(1- δ )k。 k充分大, (1- δ )k趋于0。
7.6 拉斯维加斯(Las Vegas)算法
– int RepeatedElement(Type a[],int n){
while (1){ int i=random()%n+1; int j= random()%n+1; if((i!=j)&&(a[i]==a[j])) return(i); }
–}
7.6 拉斯维加斯(Las Vegas)算法
4k n
7.4 数值概率算法
public double darts(int n)
{ // 用随机投点法计算值
源自文库nt k=0;
for (int i=1;i <=n;i++) {
double x=dart.fRandom();
double y=dart.fRandom();
if ((x*x+y*y)<=1) k++;
三、期望运行时间:
TB(n) TB(x)/|Xn| x Xn
TB(n)TA(n)s(n)当s(n)与 T A ( n ) 相比很小可以忽略
时,舍伍德算法有很好的性能。 对所有输入实例而言,运行时间相对均匀。时间复杂性
与确定性算法的时间复杂性相当 .
7.5 舍伍德(Sherwood)算法
随机快速排序算法 算法9.1 随机选择枢点的快速排序算法 输入:数组A,数组元素的的起始位置low,终止位置high 输出:按非降顺序排序的数组A 1. template <class Type> 2. void quicksort_random(Type A[],int low,int high) 3. { 4. random_seed(0);/* 选择系统当前时间作为随机数种子 */ 5. r_quicksort(A,low,high); /* 递归调用随机快速排序算法 */ 6. }
确定性的算法 :
– 算法的每一个计算步骤都是确定的, – 对于相同的输出,每一次执行过程都会产生相同的
输出。
随机算法:非形式描述
– 随机算法为使用随机函数产生器的算法。算法中的 一些判定依赖于随机函数产生器的输出。
– 随机算法对于相同的输入,在不同的运行过程中会 得到不同的输出。
– 对于相同的输入,随机算法的执行时间也可能随不 同的运行过程而不同。
8.1 随机算法引言
随机算法的优点:
– 1、执行时间和空间,小于同一问题的已知最好的确定性算法; – 2、实现比较简单,容易理解。
很多确定性的算法,其性能很坏。可用随机选择的方 法来改善算法的性能。
某些方面可能不正确,对特定的输入,算法的每一次 运行不一定得到相同结果。出现这种不正确的可能性 很小,以致可以安全地不予理睬。
7.2 随机算法的类型
3、拉斯维加斯(Las Vegas)算法:要么给 出问题的正确答案,要么得不到答案。反复求 解多次,可使失效的概率任意小。
4、蒙特卡罗(Monte Carlo)算法:总能得到 问题的答案,偶然产生不正确的答案。重复运 行,每一次都进行随机选择,可使不正确答案 的概率变得任意小。
random_seed(0); s = log(1/e);
for (t=1;t<=s;t++) {
i = random(0,n-1) ; k = 0;
for (j=0;j<n;j++)
if (A[i]==A[j])
k++;
if (k>n/2) { x = A[i]; flag = TRUE; break; }
}
return flag;
}
算法的错误概率小于所给参数e。算法的运行时间为O(nlog(1/e)) 。
7.7 蒙特卡罗(Monte Carlo)算法
素数测试 一、一般方法
– 被测试的数除以2到 n 的数,余数为0,是合数, 否则是素数。
二、蒙特卡罗算法
素数测试
Wilson定理:对于给定的正整数n,判定n是一个素数的充要条件
#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)
7.2 随机算法的类型
数值概率算法 拉斯维加斯(Las Vegas)算法 蒙特卡罗(Monte Carlo)算法 舍伍德(Sherwood)算法。
7.2 随机算法的类型
1、数值概率算法:用于数值问题的求解。所 得到的解几乎都是近似解,近似解的精度随着 计算时间的增加而不断地提高。
2、舍伍德(Sherwood)算法:很多具有很好 的平均运行时间的确定性算法,在最坏的情况 下性能很坏。引入随机性加以改造,可以消除 或减少一般情况和最坏情况的差别。
二、一般方法
每个元素和其它元素比较,并计数。如果计数值大 于n /2,该元素就是的主元素。
元素比较次数为 ( n 2 ) 。
7.7 蒙特卡罗(Monte Carlo)算法
三、蒙特卡罗算法 1、随机选择元素A[i]进行测试,若返回true,
A[i]就是主元素;否则不是主元素。
7.7 蒙特卡罗(Monte Carlo)算法
希望错误概率小于ε,则令: 2-k = ε
k=log(1/ε )
算法修改为:
7.7 蒙特卡罗(Monte Carlo)算法
BOOL majority_monte(Type A[],Type &x,int n,double e) {
int t,s,i,j,k; BOOL flag = FALSE;