`
cch123
  • 浏览: 1031 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

线性时间复杂的洗牌算法

阅读更多
昨天在wiki上看到的线性时间复杂度的算法,把他用代码实现出来了
函数里的shuffle_func2
具体参见这里http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
以下代码帖到你的编译器里,可以看到两种算法明显的效率之差了。
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <vector>
using namespace std;
int *a=0;
bool * fetch_flag=0;
vector<int>result_set;

void init_arr()
{
    delete[]a;
    delete[]fetch_flag;
    a = new int[100000];
    fetch_flag = new bool[100000];
    result_set.clear();
    for(int i=0; i<100000; i++)
    {
        a[i]=i+1;
        fetch_flag[i]=false;
    }
}
void shuffle_func1()
{
    int pos,counter,real_pos;
    srand(time(NULL));
    for(int i=100000; i>0; i--)
    {
        pos = rand()%i+1;
        //cout<<pos<<endl;
        counter=0;

        for(int j=0; j<100000,counter!=pos; j++)
        {
            if(fetch_flag[j]==false){
                counter++;
            }
            real_pos=j;
        }
        result_set.push_back(a[real_pos]);
        fetch_flag[real_pos]=true;
    }
}
void shuffle_func2()
{
    srand(time(NULL));
    for(int i=100000;i>0;i--){
        int pos = rand()%i;
        result_set.push_back(a[pos]);
        swap(a[pos],a[i-1]);
    }
}
int main()
{

    init_arr();
    clock_t t_start = clock();
    shuffle_func1();
    clock_t t_end = clock();
    cout<<"time 1"<<t_end-t_start<<endl;



    init_arr();
    t_start = clock();
    shuffle_func2();
    t_end = clock();
    cout<<"time 2"<<t_end-t_start<<endl;



    return 0;
}

分享到:
评论

相关推荐

    完美洗牌问题线性算法的论文.rar

    《完美洗牌问题》 在计算机科学中,完美洗牌是指对一个序列进行操作,使得序列中的每个元素在洗牌后都有...通过学习这些论文,我们可以掌握如何设计和实现高效、公正的完美洗牌算法,从而在实际问题中得到广泛应用。

    随机化算法实验(Sherwood型线性时间选择).docx

    2. 随机洗牌预处理:将数组元素洗牌,重新排序,以便选择基准元素。 实验结果: 通过实验,我们可以看出 Sherwood 型线性时间选择算法的实现可以达到选择数组中的中值的目的,并且可以在不同的输入规模下保持良好...

    c++实现洗牌算法源代码

    洗牌算法的一种常见实现是Fisher-Yates(或Knuth)洗牌算法,它在线性时间内完成,并且保证了均匀性。基本步骤如下: 1. 遍历数组,从最后一个元素开始。 2. 对于每个元素,生成一个随机索引,范围从当前元素的位置...

    随机化算法实验(Sherwood型线性时间选择).pdf

    实验结果表明,无论输入序列的大小如何,舍伍德型线性时间选择算法都能有效地找到中值,并且两种实现方法(随机划分基准和随机洗牌预处理)在功能上等价,都能在平均情况下提高算法效率。 总之,舍伍德型线性时间...

    舍伍德算法

    舍伍德算法 线性时间选择随机化 洗牌预处理 文件为PPT

    计算机算法概率算法正规版资料.ppt

    6. **随机预处理**:在某些情况下,确定性算法不能直接转化为舍伍德算法,这时可以通过对输入数据进行随机化预处理,如随机洗牌,来达到类似效果。这不会改变原有算法的本质,但可以提高整体效率。 总的来说,概率...

    高级随机算法

    实现随机选择通常使用Fisher-Yates(也称为Knuth)洗牌算法,该算法在原数组上进行操作,保证每个元素被选中的概率相等。同样,由于数据直接来自后台,我们无需手动输入,从而提高了效率和准确性。 最后,随机采样...

    随机发牌源程序 vc++6.0

    发牌过程可能涉及到对这个数组进行洗牌的操作,这通常通过Fisher-Yates(或Knuth)洗牌算法来实现。这个算法是一种在线性时间内完成的原地洗牌方法,即不需要额外的存储空间。算法的基本思想是从最后一个元素开始,...

    C/C++常用算法手册.秦姣华(有详细书签).rar

    第7章 复杂的数值计算算法 206 7.1 拉格朗日插值 206 7.1.1 拉格朗日插值算法 206 7.1.2 拉格朗日插值示例 207 7.2 数值积分 210 7.2.1 数值积分算法 210 7.2.2 数值积分示例 211 7.3 开平方 213 7.3.1 开...

    A Simple In-Place Algorithm for In-Shuffle

    他们提供了一个线性时间复杂度的算法,可以在原地完成入堆洗牌操作,假设列表是以数组形式表示的,索引范围为 1 至 \(2n\)。 #### 新算法的特点 本文提出的新算法相比之前的方案更为简单,易于实现。新算法的关键...

    谢菲尔德大学Matlab遗传算法工具箱改进与应用

    对于二进制编码,工具箱支持单点交叉、两点交叉、多点交叉和洗牌交叉;对于实值编码,则提供了离散重组、中间重组、线性重组和具有突变特性的线性重组等多种交叉方式。 ##### 2.5 变异算子 变异操作可以增加种群的...

    52张纸牌的随机分发

    一种常见的方法是Fisher-Yates(也称为Knuth)洗牌算法,该算法在线性时间内完成,并确保了每一种排列的等概率出现。其基本思想是从最后一张牌开始,随机选择一张与其交换位置,然后向前遍历,直到第一张牌。这样,...

    C++基础算法

    10. **模拟与随机化算法**:书中可能包含一些需要模拟过程的算法,如模拟投骰子、洗牌等,以及基于概率的随机化算法,如蒙特卡洛方法。 11. **C++编程基础**:除了算法本身,书中还会涉及C++编程语言的基本语法、...

    随机森林(回归)算法的python代码【包括:数据洗牌、十折交叉验证、输出预测结果、获取特征重要性】

    如原始数据集并未划分训练集与测试集,建议在此前进行数据集的划分工作,代码如下: import pandas as pd from sklearn.model_selection import train_test_split # 读取CSV文件 data = pd.read_csv('数据清洗后....

    概率算法PPT学习教案.pptx

    当随机预处理技术应用于确定性算法,例如对输入数据进行随机洗牌,可以达到类似舍伍德算法的效果,例如在快速排序和线性时间选择算法中。 这些例子展示了概率算法在不同领域的应用,包括几何概率、数值计算和优化...

    计算机算法设计与分析(共30张PPT).pptx

    6. **随机预处理**:在某些情况下,如果无法直接将确定性算法转化为舍伍德算法,可以通过预先随机化输入数据,如随机洗牌,来达到类似效果,这种方法对于选择算法和排序算法尤其有效。 理解这些算法设计和分析的...

    Android扑克牌猜点小游戏

    洗牌算法通常是通过Fisher-Yates(Knuth)洗牌算法实现,确保随机性。 3. **事件处理**:玩家的点击事件需要被正确捕获并处理。例如,当玩家点击开始按钮时,触发洗牌和抽牌操作;点击输入框提交答案后,判断点数...

    经典算法(C语言)包含51个经典算法的C语言实现

    20. **洗扑克牌(Shuffle)**:通常使用Fisher-Yates洗牌算法,实现随机排列。 21. **Craps赌博游戏**:涉及概率计算和随机数生成。 22. **约瑟夫问题(Josephus Problem)**:循环杀死序列中的特定位置,通常使用循环...

    python 实现 leetcode 各种问题 课程设计 代码

    Fisher-Yates洗牌算法(Fisher-Yates Shuffle) 高斯复活节计算(Gauss Easter) 格雷厄姆扫描算法(Graham Scan) 贪婪算法(Greedy) 猜数字搜索(Guess The Number Search) H指数(H Index) 最近最少使用...

Global site tag (gtag.js) - Google Analytics