线性时间选择算法
- 快速排序算法、线性时间选择算法 P206
- 有时也会遇到这样的情况,即所给的确定性算法无法直接改造成舍伍德型算法。此时可借助于随机预处理技术,不改变原有的确定性算法,仅对其输入进行随机洗牌,同样可收到舍伍德算法的效果。例如,对于确定性选择算法,可以用下面的洗牌算法Shuffle将数组a中元素随机排列,然后用确定性选择算法求解。这样做所收到的效果与舍伍德型算法的效果是一样的。
template
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]);
}
}
Pollard算法(2)
void Pollard(int n)
{// 求因子分割的拉斯维加斯算法
RandomNumber rnd;
int i=1;
int x=rnd.Random(n); // 随机整数
int y=x, k=2;
while (true) {
i++;
x=(x*x-1)%n; // int d=gcd(y-x,n); // 求n的非平凡因子
if ((d>1) && (d<n)) cout<<d<<endl;
if (i==k) {y=x; k*=2;}
}
}
主元素问题(2)
template
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
bool MajorityMC(Type *T, int n, double e)
{// 重复调用算法Majority
int k=ceil(log(1/e)/log(2));
for (int i=1;i<=k;i++)
if (Majority(T,n)) return true;
return false;
}
素数测试(2)
void power( unsigned int a, unsigned int p, unsigned int n, unsigned int &result, bool &composite)
{// 计算mod n,并实施对n的二次探测
unsigned int x;
if (p==0) result=1;
else
{ power(a,p/2,n,x,composite); // 递归计算
result=(x*x)%n; // 二次探测
if ((result==1)&&(x!=1)&&(x!=n-1)composite=true;
if ((p%2)==1) result=(result*a)%n; // p是奇数
}
}
bool Prime(unsigned int n)
{//测素数的蒙特卡罗法
RandomNumber rnd;
unsigned int a, result;
bool composite=false;
a=rnd.Random(n-3)+2;
power(a,n-1,n,result,composite);
if (composite||(result!=1)) return false; else return true;
}