当前位置:文档之家› 算法设计与分析耿国华第七章

算法设计与分析耿国华第七章


(3)合并:由于对a[p:q-1]和a[q+1:r]的 排序是就地进行的,所以在a[p:q-1]和 a[q+1:r]都已排好序后,不需要执行任何 计算,a[p:r]就已排好序。
Chapter
7
7.3 舍伍德算法
2.线性时间选择算法
对于给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出 这n个元素中第k小元素,即如果将这n个元素按照线性顺序排列 时,排在第k个位置的元素即为要找的元素。它的基本思想也是 对输入数组进行递归划分处理。与快速排序不同的是,该算法 只对划分出的子数组之一进行递归处理。 (1)数组a[p:r]被划分成两个子数组a[p:i]和a[i+1:r],使 a[p:i]中的每个元素都不大于a[i+1:r]中的每个元素。接着计 算子数组a[p:i]中元素个数j。 (2)如果k≤j,则a[p:r]中第k小元素落在子数组a[p:i]中。 (3)如果k>j,则要找的第k小元素落在子数组a[i+1:r]中。由 于此时已知道子数组a[p:i]中元素均小于要找的第k小元素,因 此,要找的a[p:r]中第k小元素是a[i+1:r]中的第k-j小元素。
Chapter
1
7.2 数值随机算法

• • • • • • • • • • • • •
算法7.2 用随机投点法计算值
double Darts(int n) { static RandomNumber dart;//随机数对象 int k=0; for (int i=1;i <=n;i++) { double x=dart.fRandom();//产生[0,1)之间的随机实数 double y=dart.fRandom(); //判断条件为(x*x+y*y)<=1,表示当前随机处于圆内 if ((x*x+y*y)<=1) k++; } return 4*k/double(n); }
t A (n)
xXn
t
A
( x)/ | X n |
这不能排除存在x∈ X n 使得 t A ( x) t A (n) 的可能性。我们希望获 得一个随机算法B,使得对问题的输入规模为n的每一个实例 x∈Xn,均有:
t B ( x) t A (n) s(n)
当s(n)与 t A (n) 相比可忽略时,舍伍德算法可 获得很好的平均性能。

• • • • • • • • • • • • • • • •
算法7.1 随机数类
//随机数类 const unsigned long maxshort =65536L; const unsigned long multiplier =1194211693L; const unsigned long adder =12345L; class RandomNumber { private: unsigned long randSeed; //当前种子 public: //构造函数,默认值0表示由系统自动 产生种子 RandomNumber(unsigned long s=0); //产生0:n-1 之间的随机的整数 unsigned short Random(unsigned long n); //该函数的参数n<=65536; //产生[0,1)之间的随机实数 double fRandom(void); };

随机数是由试验(如摸球或抽签)产生的随 机数,是专门的随机试验的结果。计算器 或计算机上无法产生真正的随机数,计算 器或计算机产生的随机数是通过一个固定 的、可以重复的计算方法产生的,具有周 期性(周期很长),具有类似随机数的统计特 征,但并不是真正的随机数,故叫伪随机 数。这样的发生器称为伪随机数发生器。
(b)
图7-1 计算值的随机投点法
Chapter
7
7.2 数值随机算法

问题分析:假定飞镖击中方形靶子任一点的概率相等。设圆的半 径为r,面积s1= r 2 ,方靶面积s2= 4r 2 。由等概率假设可知, 2 落入圆中的飞镖和正方形内的飞镖平均数目之比为: k r 2 。 n 4r 4 4k 。 由此可得:
Chapter
7
7.1 随机算法基础
7.1.1 伪随机数
7.1.2 实例分析
Chapter
7
7.1 随机算法基础
伪随机数
• 7.1.1
• 例7-1
产生1到25之间的随机整数。 分析:将25个大小形状相同的小球分别标1,2,„,24,25 放入一个袋中,充分搅拌,从中摸出一个球,这个球上 的数就是得到的随机数。
• • • • • • • • • • • • • • • • •
//用线性同余式计算新的种子 RandomNumber::RandomNumber(unsig ned long s) { if(s==0) randSeed =time(0); //用系统 时间产生种子 else randSeed =s; //由用户提 供种子 } //生成0:n-1之间的随机数 Unsigned short RandomNumber::Random(unsigned long n) { RandSeed =multiplier*randSeed +adder; retrun(unsigned short)((randSeed>>16)%n); } //生成[0,1)之间的随机数 double RandomNumber::fRandom(void) { return Random(maxshort)/double(maxshort); }
由线性同余法产生的随机序列满足:
Байду номын сангаас
a0 d an (ban1 c) modm
n 1,2,
其中b为乘数,b>=0;c为增量,c>=0;d称为 该随机序列的种子dm;m为模数,m>0,m应 取充分大,因此可取m为机器大数,另外应取 gcd(m,b)=1,因此可取b为一素数。
Chapter

Chapter
7
7.3 舍伍德算法

对于选择问题来说,采用拟中位数作为划分基准,可以保证 在最坏情况下用线性时间完成选择。最坏情况发生在划分过 程中产生的两个区域分别包含n-1个元素和1个元素的时候; 最好情况是每次划分所取的基准都正好为中值,即每次都产 生两个大小为n/2的区域。如果只简单地用待划分数组的第 一个元素作为划分基准,则算法的平均性能较好,而在最坏 情况下却需要计算时间。
Chapter
7
7.2 数值随机算法
数值随机化算法经常用于数值问题的求解。这类算法得到的往 往是近似解,且近似解的精度随计算时间的增加而不断增高。 例7-3 随机投点法计算Pi值 问题描述:将n根飞镖随机投向一正方形的靶子,如图7-1(a)所 示。计算落入此正方形的内切圆中的飞镖数目k。
• •
(a)
• • • • • • • • •
算法
设计与分析
算法设计与分析
第七章 随机算法
主编 耿国华
Chapter
7
本章内容
7.1 随机算法基础 • 7.1.1 伪随机数 • 7.1.2 实例分析 7.2 数值随机算法 7.3 舍伍德算法 • 7.3.1 基本的舍伍德型随机算法 • 7.3.2 线性表的快速查找 7.4 拉斯维加斯算法 • 7.4.1 拉斯维加斯算法的基本思想 • 7.4.2 分班问题 7.5 蒙特卡罗算法 • 7.5.1 蒙特卡罗算法的基本思想 • 7.5.2 蒙特卡洛算法的基本概念 • 7.5.3 主元素问题 • 7.5.4 素数测试 7.6 本章小结

舍伍德型选择算法以随机方式选择一个数组 元素作为划分基准,既能保证算法的线性时 间平均性能,又能有效避免计算拟中位数的 问题。
Chapter
7
7.3 舍伍德算法
例7-4 数组a[6]={5 8 2 15 32 3},k=3,l=1,r=6。计算数组a中的 第k小元素。
问题分析: 1)随机选择一个数: 15。交换a[0] 和15,此时以15作为划分基准。 1 5 8 2 5 3 2 3 2)划分数组:i初始化为0,j初始化为5。i从左向右,直到找到第一个大于划 分基准的元素停止,此时i=4。j从右向左,直到找到第一个比划分基准小的元素, 此时j=5。由于i<j,所以交换这两个位置上的元素。 1 5 8 2 5 3 3 2 3)继续查找,直到i>j。此时i=5,j=4。低区子数组中的元素个数5不等于k, 交换a[j]和划分基准元素。 3 8 2 5 1 5 3 2 4)低区子数组元素的个数大于k,则第k小元素在低区子数组中,改变右边界, 即r=3。此时只需在低区子数组中查找。 3 8 2 5 5)重复步骤1),得到 5 8 2 3 6)初始化i=0, j=3。重复步骤2),此时i=1,j=3。由于i<j,交换后的数组 为: 5 3 2 8 重复步骤3),此时i=3,j=2。低区子数组中的元素个数3等于k,则结果为: 划分基准的值5。
Chapter
7
7.3 舍伍德算法

算法7.4 随机洗牌算法 template<class Type> void Shuffle(Type a[], int n) { static RandomNumber rnd; for (int i=0;i<n;i++) { int j=rnd.Random(n-i)+i; Swap(a[i], a[j]); } }
Chapter
7
7.3 舍伍德算法
• 7.3.1 基本的舍伍德型随机化算法 • 1.快速排序算法
对于输入的子数组a[p:r],可按以下三个步骤进行排序。 (1)分解:以a[p]为基准元素将a[p:r]划分成3段a[p:q-1],a[q], a[q+1:r],使a[p:q-1]中任何一个元素小于等于a[q],而 a[q+1:r]中任何一个元素大于等于a[q]。下标q在划分过程中确 定。 (2)递归求解:通过递归调用快速排序算法分别对a[p:q-1]和 a[q+1:r]进行排序。
相关主题