随机化算法——舍伍德算法的应用

来源:互联网 发布:sqlserver新连接一个库 编辑:程序博客网 时间:2024/09/21 08:18

一、写作目的

这篇文章主要是通过舍伍德算法的具体应用来初步了解舍伍德算法。欢迎大家讨论和指教。

二、算法思想

我这里只说下他的基本思想在一般输入数据的程序里,输入多多少少会影响到算法的计算复杂度。这时可用舍伍德算法消除算法所需计算时间与输入实例间的这种联系。即消除或减少问题实例间的差别。

二、算法的应用类型

按照笔者的理解,该算法的主要用途是用于做优化的。

三、具体应用

事先说明下:以后章节,若在代码中头文件里包含了RandomNumber.h头文件,请查看前面写的《概率算法 — 随机数》里的伪随机数类RandomNumber.我以后不再提醒。
如果用java,随机数类可以不用自己编写。

非递归版的舍伍德快速排序算法-计算第k小元素

#include "RandomNumber.h"#include <iostream>#include <iomanip>#include <time.h>using namespace std;const int INF = 9999; // 交换a, b的值template <typename Type>void Swap(Type &a, Type &b){Type temp;temp = a;a = b;b = temp;} template <typename Type>Type select(Type a[], int lt, int rt, int k){// 计算a[lt:rt]中第k小元素static RandomNumber rnd;while(true){if(lt > rt)return a[lt];int i = lt, j = lt+rnd.Random(rt-lt+1); // 随机选择的划分基准Swap(a[i], a[j]);j = rt+1;Type pivot = a[lt];//以划分基准为轴作元素交换while(true){while(a[++i] < pivot);while(a[--j] > pivot);if(i >= j)break;Swap(a[i], a[j]);}if(j - lt + 1 == k)return pivot;a[lt] = a[j];a[j] = pivot;// 对子数组重复划分过程if(j - lt + 1 < k){k = k - j + lt - 1;lt = j + 1;}elsert = j - 1;}} template <typename Type>Type Select(Type a[], int n, int k){// 计算a[0: n-1]中第k小元素// 假设a[n]是一个键值无穷大的元素if(k < 1 || k > n)cerr << "Wrong!" << endl;return select(a, 0, n-1, k);} int main(){int arr[7] = {3, 2, 5, 7, 10, INF};cout << Select(arr, 6, 4) << endl;}


洗牌算法

有时候无法直接把确定性算法改造为舍伍德算法,这时候对输入洗牌,同样可收到舍伍德算法的效果。   
源代码非常简单,大家可以自行搜索下。


舍伍德思想解决迅雷2010年校招--发牌

        问题描述:52张扑克牌分发给4人,每人13张,要求保证随机性。已有随机整数生成函数rand(),但开销较大。请编写函数实现void deal(int a[],int b[],int c[],int d[]),扑克牌用序号0-51表示,分别存在大小为13的a,b,c,d四个数组中,要求尽可能高效。

解决方案:
算法的主要步骤似乎是利用已有的生成函数rand()生成r作为种子,再继续对r进行线性通余随机数生成法,其实我不太懂........
疑惑:编写代码时如何让保证随机生成的某张牌如6只有四张?

搜索有序表

  • 搜索思想:随机抽取数组元素若干次,从较接近搜索元素x的位置开始做顺序搜索。

跳跃表 加快链表搜索速度


四、参考资料

http://www.acmerblog.com/random-algorithm-2926.html

http://www.cnblogs.com/hxsyl/p/3219621.html


  
0 0
原创粉丝点击