随机化算法——舍伍德算法的应用
2014-09-04 19:18
357 查看
一、写作目的
这篇文章主要是通过舍伍德算法的具体应用来初步了解舍伍德算法。欢迎大家讨论和指教。二、算法思想
我这里只说下他的基本思想:在一般输入数据的程序里,输入多多少少会影响到算法的计算复杂度。这时可用舍伍德算法消除算法所需计算时间与输入实例间的这种联系。即消除或减少问题实例间的差别。二、算法的应用类型
按照笔者的理解,该算法的主要用途是用于做优化的。三、具体应用
事先说明下:以后章节,若在代码中头文件里包含了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; } else rt = j - 1; } } template <typename Type> Type Select(Type a[], int n, int k) { // 计算a[0: n-1]中第k小元素 // 假设a 是一个键值无穷大的元素 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.htmlhttp://www.cnblogs.com/hxsyl/p/3219621.html
相关文章推荐
- 一窥随机化算法——舍伍德算法的应用
- VC调试器高级应用----高级断点篇
- DBGRIDEH 组件在Borland开发工具中应用全攻略
- 转(时间对象的格式化&javascript应用:实现复选框全选/全不选切换)
- 无法将2000MSDEServicePack应用到由SDK1.0安装的MSDE实例
- 构建高性能J2EE应用的五种核心策略
- 关于Gis的c#开发,mapinfor 的应用
- Palm应用开发之三appinfo.json 文件详解
- .NET嵌入DLL ILMerge工具应用
- Java Annotation高级应用
- jetty学习笔记-应用部署
- 关于JAVA中JNI的应用
- Android NFC应用小木公交
- Socket 应用
- memcached是应用最广的开源cache产品
- 程序员谈“应用推广”
- Android应用--简、美音乐播放器添加电话监听
- 【转】Sqlite在C#中的应用
- uml 在需求分析阶段的应用
- Android应用开发——Activity组件