您的位置:首页 > 其它

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

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只有四张?
  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: