三种经典的洗牌算法

参考原文链接:https://blog.csdn.net/qq_25026989/article/details/89512769

问题描述:洗牌算法是将原来的数组进行打散,使原数组的某个数在打散后的数组中的每个位置上等概率的出现。

主要有3中经典的洗牌算法:

1.抽牌

            1.初始化原始数组和新数组,原始数组长度为n(已知);

            2.从还没处理的数组(假如还剩k个)中,随机产生一个[0, k)之间的数字p(假设数组从0开始);

            3.从剩下的k个数中把第p个数取出;

            4.重复步骤2和3直到数字全部取完;

            5.从步骤3取出的数字序列便是一个打乱了的数列。

           时间复杂度为O(n*n),空间复杂度为O(n).

2.换牌原地打乱顺序):

             1. 建立一个数组大小为 n 的数组 arr,分别存放 1 到 n 的数值;
             2. 生成一个从 0 到 n - 1 的随机数 x;
             3. 输出 arr 下标为 x 的数值,即为第一个随机数;
             4. 将 arr 的尾元素和下标为 x 的元素互换;
             5. 同2,生成一个从 0 到 n - 2 的随机数 x;
             6. 输出 arr 下标为 x 的数值,为第二个随机数;
             7. 将 arr 的倒数第二个元素和下标为 x 的元素互换;
                ……
             如上,直到输出 m 个数为止

             时间复杂度为O(n),空间复杂度为O(1)

            缺点必须知道数组长度n.原始数组被修改了,这是一个原地打乱顺序的算法,算法时间复杂度也从Fisher算法的 O(n2)提              升到了O(n)。由于是从后往前扫描,无法处理不知道长度或动态增长的数组。

3.插牌(蓄水池抽样):  

          1.先选中第1到k个元素,作为被选中的元素。然后依次对第k+1至第N个元素做如下操作:

          2.每个元素都有k/x的概率被选中,然后等概率的(1/k)替换掉被选中的元素。其中x是元素的序号。

          从N个元素中随机等概率取出k个元素(洗牌发牌可以认为k=1),N长度未知。在o(n)时间内对n个数据进行等概率随机            抽取。如果数据集合的量特别大或者还在增长(相当于未知数据集合总量),该算法依然可以等概率抽样.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/440265.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据库实验课堂】实验一:数据库的管理

实验一:数据库的管理 1、假设SQL Server服务已启动,并以Administrator身份登录计算机(文件名称自定);请分别使用Management界面方式和T-SQL语句实现以下操作: 1) 要求在本地磁盘D创建一个学生-课程数据库…

网络编程懒人入门(二):快速理解网络通信协议(下篇)

转自即时通讯网:http://www.52im.net/ 原作者:阮一峰(ruanyifeng.com),本文由即时通讯网重新整理发布,感谢原作者的无私分享。 1、前言 本文上篇《网络编程懒人入门(一):快速理解网络通信协议&#xff0…

为什么说逻辑回归LR是线性分类器?

问题描述:为什么说逻辑回归LR是非常典型的线性分类器? 首先,我们要弄明白区分线性与非线性分类器的标准是什么?是决策边界(Decision Boundary) 以二分类(LR可以用于多分类)为例进行…

【数据库实验课堂】实验二 使用SQL Server管理数据表

实验二 使用SQL Server管理数据表: 1、请在指定数据库内完成以下内容: 1) 依据数据表的结构创建相对应的数据表,表结构如下所示; **学生信息表(student)**字段名称 字段类型及长度 说明 备注 S…

5, Data Augmentation

Intro 这是深度学习第5课 在本课程结束时,您将能够使用数据增强。 这个技巧让你看起来拥有的数据远远超过实际拥有的数据,从而产生更好的模型。 Lesson [1] from IPython.display import YouTubeVideo YouTubeVideo(ypt_BAotCLo, width800, height45…

朴素贝叶斯算法注意事项(有待完善)

1.朴素贝叶斯算法的优缺点总结: 优点: 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率;分类速度快,准确度高;对缺失数据不太敏感,算法简单,常用于文本分类(如新闻…

网络编程懒人入门(三):快速理解TCP协议一篇就够

转自即时通讯网:http://www.52im.net/ 原作者:阮一峰(ruanyifeng.com),本文由即时通讯网重新整理发布,感谢原作者的无私分享。 1、前言 本系列文章的前两篇《网络编程懒人入门(一):快速理解网络通信协议…

【数据库实验课堂】实验三:管理SQL Server表数据

以课本指定的数据库为例,并依据数据表的结构创建相对应的数据表(student、course、sc),请分别使用Management Stuio界面方式及T-SQL 语句实现进行以下操作: 向各个数据表中插入如下记录: 学生信息表&#…

分类问题的模型评估指标总结

在分类任务下,预测结果(Predicted Condition)与正确标记(True Condition)之间存在四中不同的组合,构成混淆矩阵(可适用于多分类),通常有这几种主要模型评估指标:精确率(查的准)、召回率(查的全对正样本的区分能力)、F1值(反映模型…

6. A Deeper Understanding of Deep Learning

Intro 这是深度学习第6课。 在本课程结束时,您将了解随机梯度下降和反向传播如何用在深度学习模型中设置权重。 这些主题很复杂,但许多专家认为它们是深度学习中最重要的思想。 Lesson [1] from IPython.display import YouTubeVideo YouTubeVideo(…

JetBrains - IDEA 常用快捷键汇总

【常规】 CtrlShift Enter,语句完成“!”,否定完成,输入表达式时按 “!”键CtrlE,最近的文件CtrlShiftE,最近更改的文件ShiftClick,可以关闭文件Ctrl[ OR ],可以跑到大…

nltk安装punkt等语料库时报SSL错误完美解决方案及离线安装方法

nltk是NLP领域中一个比较通用的国际分词工具,但是使用时往往依赖语料库数据包,需要安装到本地,以下介绍在线安装和离线安装两种方式: (ps:对NLP感兴趣的朋友可以相互学习,我的微信号&#xff1…

7. Deep Learning From Scratch

Intro 这是深度学习第7课。 到目前为止,您构建的模型依赖于预先训练的模型。 但它们不是许多用例的理想解决方案。 在本课程中,您将学习如何构建全新的模型。 Lesson [1] from IPython.display import YouTubeVideo YouTubeVideo(YbNE3zhtsoo, widt…

【POJ - 3126】Prime Path(bfs)

题干: 给你两个四位的素数a,b。 a可以改变某一位上的数字变成c,但只有当c也是四位的素数时才能进行这种改变。 请你计算a最少经过多少次上述变换才能变成b。 例如:1033 -> 8179 1033 1733 3733 3739 3779 8779 8179 最…

最实用的Git命令总结:新建本地分支、远程分支、关联和取消关联分支、清除本地和远程分支、合并分支、版本还原、tag命令、中文乱码解决方案、如何fork一个分支和修改后发起合并请求

1.常用命令git、tag整理 1、新建分支本地分支 git branch <branch-name>远程分支 git push origin <branch-name>:<new-branch-name> 2、删除分支本地分支 git branch -d <branch-name> 或 git branch -D <branch-name>远程分支 git push o…

8. Dropout and Strides For Larger Models

Intro 这是深度学习第8课。 本科结束后&#xff0c;你将会理解并知道如何使用&#xff1a; Stride lengths来快速建立模型并减少内存消耗&#xff1b;Dropout 来对抗过拟合&#xff1b; 这两个技术在大型模型中很有用。 Lesson [1] from IPython.display import YouTubeV…

【POJ - 2255】Tree Recovery (给定树的先序中序,输出后序)

题干&#xff1a; Input The input will contain one or more test cases. Each test case consists of one line containing two strings preord and inord, representing the preorder traversal and inorder traversal of a binary tree. Both strings consist of unique…

Java基础部分快速复习(以前复习的时候放在自己的新浪博客上)

工作后Java基本没有用到&#xff0c;有时候自己也会把基础过一遍&#xff0c;下面的链接是以前重温的时候整理的Java基础最核心部分的知识点和代码示例放在自己的新浪博客上&#xff0c;如果以后有需要&#xff0c;直接从这里进入&#xff0c;可以快速复习&#xff0c;节省时间…

0.Overview——Deep Learning

本文为Kaggle Learn的Deep Learning课程的中文翻译。原链接为&#xff1a;https://www.kaggle.com/learn/deep-learning 1. Intro to Deep Learning and Computer Vision A quick overview of how models work on images 2. Building Models from Convolutions Scale up fr…

SQL基础用法总结(以前复习的时候放在自己的新浪博客上)

工作后主要做移动端和前端这一块&#xff0c;后端的知识都是靠自己学习积累的&#xff0c;下面的链接是以前重温的时候整理的SQL基础最核心部分的知识点和代码示例放在自己的新浪博客上&#xff0c;如果以后有需要&#xff0c;直接从这里进入&#xff0c;可以快速复习&#xff…