概率算法

1. 随机数

线性同余法:

a0=d

an=(b*an-1+c) mod m

其中,d称为随机种子。gcd(b, m)=1

const unsigned long maxshort = 65536L; const unsigned long multiplier = 1194211693L; const unsigned long adder = 12345L; class RandomNumber { private: unsigned long seed; public: RandomNumber(unsigned long s = 0) { if (s == 0) seed = time(0); else seed = s; } // generate a integer from 0 to n-1 unsigned short Random(unsigned long n) { seed = multiplier * seed + adder; return (unsigned short) ((seed >> 16) % n ); } // generate a double less than 1 double fRandom() { return Random(maxshort) / double(maxShort) ; } }

 

2. 计算PI

用投点法估算

 // calculate using n points double Darts(int n) { RandomNumber rnd; int k = 0; for (int i=1;i<=n;i++) { double x = rnd.fRandom(); double y = rnd.fRandom(); if (y<=f(x) ) k++; } return k/(double)n; }

 

投点法思想可用于求定积分。

而根据强大数定理,可得一种平均值法求定积分。数学证明此处不给出。以I = (b-a)/n * ∑g(xi)

double Integration(double a, double b, int n) { RandomNumber rnd; double y = 0; for (int i=1;i<=n;i++) { double x = (b-a) * rnd.fRandom() + a; y+=g(x); } return (b-a) * y / (double)n; }

 

3. Sherwood算法

对于一个算法A,当它输入实例为x时所需的时间为tA(x)。则算法A的平均时间为c= ∑tA(xi) / |Xn|,n为数据规模。我们不能排除有些实例x使得tA(x) >>c。

此时希望有一个概率算法B,使得对于所有x属于Xn有tB(x) = c +s(n)

 

 搜索有序表:

用两个数组来表示一个有序表,value数组为原数组,value[ link[0] ] 为表中最小的元素,link[i]表示有序的下一个元素的位置。此相当于用数组模拟指针链表

例如

i : 0 1 2 3 4 5 6 7 value : 2 3 13 1 5 21 8 link : 4 2 5 6 1 7 0 3

顺序搜索一个元素的时间复杂度是O(n)

对此,一个随机化搜索的思想就出来了:随机抽取元素若干次,从最接近的元素x开始顺序搜索。可以证明,如果随机取k个元素,平均比较次数为O(n/(k+1) )。所以k取sqrt(n),平均时间为O( sqrt(n) )。

template <class T> class List { private: int n; // current length int maxLength; // capacity T *v; int *link; RandomNumber rnd; T Small, Tail; public: List(T small, T tail, int maxL) { maxLength = maxL; value = new T[maxL + 1]; link = new int[maxL + 1]; Tail = tail; n = 0; link[0] = 0; v[0] = tail; Small = small; } // seach for element x bool Search(T x, int& index) { index = 0; T max = Small; int m = floor(sqrt(double(n) ) ); for (int i=1;i<m;i++) { int j = rnd.Random(n) + 1; T y = v[j]; if ((max < y) && (y < x)) { max = y; index = j; } } // sequential search while (v[ link[index] ] < x) index = link[index]; return (value[ link[index] ] == x ); } void Insert(T k) { if ((n == maxLength) || (k >= Tail) ) return; int index; if (!Search(k, index) ) { value[++n] = k; link[n] = link[index]; link[index] = n; } } int SearchLast() { int index = 0; T x = v[n]; T max = Small; int m = florr(sqrt(double(n) ) ); for (int i = 1;i <= m;i++) { int j = rnd.Random(n) + 1; T y = v[j]; if ( (max < y ) && (y < x ) ) { max = y; index = j; } } while (link[index] != n) index = link[index]; return index; } void Delete(T k) { if ((n == 0) || (k >= Tail) ) return; int index; if ( Seach(k, index) ) { int p = link[index]; if (p == n) link[index] = link[p]; else { if (link[p] != n) { int q = SearchLast(); link[q] = p; link[index] = link[p]; } v[p] = v[n]; link[p] = link[n]; } n--; } } };

 

 

你可能感兴趣的:(算法,list,Integer,search,Random,insert)