一窥随机化算法——舍伍德算法的应用
2014-09-04 18:31
267 查看
一、写作目的
这篇文章主要是通过舍伍德算法的具体应用来初步了解舍伍德算法。欢迎大家讨论和指教。二、算法思想
我这里只说下他的基本思想:在一般输入数据的程序里,输入多多少少会影响到算法的计算复杂度。这时可用舍伍德算法消除算法所需计算时间与输入实例间的这种联系。即消除或减少问题实例间的差别。
二、算法的应用类型
按照笔者的理解,该算法的主要用途是用于做优化的。三、具体实例
事先说明下:以后章节,若在代码中头文件里包含了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只有四张?
相关文章推荐
- 随机化算法——舍伍德算法的应用
- 关于asp.net开发B/S应用系统的思索和讨论
- 应用框架的设计与实现——.NET平台(7.事件通知服务.源码分析)
- 如何在VS2005中使用C#开发Silverlight 1.1应用
- EPOLL应用详解
- [导入]从架构设计到系统实施——基于.NET 3.0的全新企业应用系列课程(9):设计基于CardSpace的身份验证系统.zip(7.98 MB)
- linux awk应用详解
- Extjs中进度条的应用
- 告别aspx,高性能快捷开发 — JQuery Smart UI 快捷开发实例应用(一)入门【前篇】
- FTP的两种模式和在实际工作中应用
- MyWakeUpTunes:声色俱佳的闹钟提醒应用
- MAX里DotNet 应用函数
- Android应用进入爆发期 手机游戏仍是市场重心
- oradebug的简单介绍及应用
- AspNetPager分页控件的应用(一)
- 经验分享:开发SWT应用两点心得
- 函数应用SAE-Python教程(一) 在SAE上进行Python的开发
- Linux内核哈希表分析与应用
- jms基础概念和应用场景
- 紫外线消毒器在家庭应用中的维护保养介绍