洗牌算法分析

2024-02-09

我遇到了以下洗牌算法的分析:

问:给定一个不同整数的数组,给出一个算法来随机 对整数重新排序,以便每个可能的重新排序都是相等的 可能。换句话说,给定一副牌,你如何洗牌 使得任何牌的排列都是同样可能的?

好答案:按顺序遍历元素,将每个元素与 数组中不早于出现的随机元素 元素。这需要 O(n) 时间。注意,有几种可能 这个问题的解决方案,以及几个好看的答案 那些是不正确的。例如,对上面的稍作修改 算法,其中一个元素与任意元素进行交换 大批不以相同的概率给出每个重新排序.

我想知道的是,为什么与使用 Knuth shuffle(已描述)相比,将每个元素与数组中的任何其他元素交换不会产生良好的洗牌效果。另外,Knuth shuffle 是如何以等概率选择值的?任何数学或证明都将受到高度赞赏。


最简单的证明该算法不会产生均匀随机排列

for (int i = 0; i < 3; ++i) {
   swap(a[i], a[rand() % 3]);
}

它产生 27 种可能的结果,但只有 3 种! = 6 种排列。由于 6 不能整除 27,所以一定有一些排列被选取太多,而另一些排列被选取太少。

为什么 O(n) 算法是最优的?好吧,随机洗牌有时必须触及每个输入(以更改它们),因此任何最佳算法都需要执行至少 O(n) 的工作。

为什么 Knuth 算法是正确的?这需要更多的洞察力。您可以通过归纳证明第一个项目以正确的概率被选择(每个项目同样有可能成为第一个),然后证明当您在循环中前进时归纳步骤成立,第二个、第三个等项目是也以正确的概率从数组的其余部分中选择。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

洗牌算法分析 的相关文章

  • 如何计算列表的最小不公平性总和

    我试图将问题陈述总结如下 Given n k和一个数组 列表 arr where n len arr and k is an integer in set 1 n inclusive 对于数组 或列表 myList 不公平总和定义为sum中
  • 比 in_array 更快?

    我需要将一个值与一组数组进行比较 但是 我需要比较 foreach 中的多个值 如果使用 in array 它可能会很慢 非常慢 有没有更快的替代方案 我当前的代码是 foreach a as b in array b array 谢谢 你
  • Python:for 循环 - for i in range(0,len(list) 与 for i in list

    这是一个非常简单的Python 力学问题 为什么我不能只说 for i in range original list 而不是 for i in range 0 len original list 人们通常使用范围而不是前者吗 谢谢 If I
  • 地图应用的聚类算法

    我正在研究地图上的聚类点 纬度 经度 对于快速且可扩展的合适算法有什么建议吗 更具体地说 我有一系列纬度 经度坐标和一个地图视口 我正在尝试将靠近的点聚集在一起以消除混乱 我已经有了解决问题的方法 see here http bouldr
  • 找到质数?

    为了判断 N 是否是质数 我们只需要查找所有小于或等于 sqrt N 的数字 这是为什么 我正在编写 C 代码 因此试图理解其背后的原因 如果 N 是一个正整数 且能被两个正整数 1 和 N 整除 则 N 是素数 由于数字的约数不能大于该数
  • 所有可能的骑士在普罗梅拉的棋盘上移动

    是否有可能用马从初始位置 I J 绕过大小为 N N 的棋盘 并且只访问每个方格一次 define A True A I J false active proctype method bit I 4 bit J 3 bit K 1 bit
  • Python 中的空填字游戏求解器

    我得到了一个包含填字游戏蓝图的矩阵 当然 它是空的 我们的目标是填补整个难题 这是 Checkio 的一项任务 我已经为此奋斗了相当长一段时间 根据我对复杂性的理解 这个问题没有完美的算法 不过 必须有最好的方法来做到这一点 对吧 我尝试了
  • 如何设计一种算法来计算倒数式数学数字难题

    我一直想这样做 但每次我开始思考这个问题时 它的指数性质都会让我大吃一惊 我希望能够理解的问题解决器和代码是针对倒计时数学问题的 给定一组数字 X1 到 X5 计算如何使用数学运算将它们组合起来生成 Y 您可以应用乘法 除法 加法和减法 那
  • 处理流星中的长服务器端计算

    我正在使用 jimp https www npmjs com package jimp https www npmjs com package jimp 在meteor JS中生成图像服务器端 换句话说 我正在使用递归算法 计算 图像的像素
  • 填充体积算法

    我有一个具有一定尺寸长度 宽度 高度的盒子 我有不同长度 宽度 高度的物品 是否有现有的算法可以确定放入盒子中的最佳物品 这称为装箱 切割库存 背包问题 并且是 NP 难问题 一般来说 您只能通过使用启发式方法获得近似解 请参见示例 htt
  • 计算字符串的所有子串中子序列的出现次数

    我想编写一个算法来计算字符串的所有子字符串中字符子序列 不相交 出现的总数 下面是一个例子 字符串 jabcohnnyjohnny 后续 约翰尼 包含子序列的子字符串 jabcohnny jabcohnnyj jabcohnnyjo jab
  • 简单的排名算法

    我需要创建一个民意调查 按照项目的好坏顺序创建一个排名列表 我打算向每个用户展示两个项目 让他们选择一个他们认为更好的项目 然后多次重复这个过程 它有点类似于您在社交网络电影 我应该如何根据收到的答案对项目进行排名 看着那 这ELO国际象棋
  • Python Pandas:沿一列比较两个数据帧,并返回另一个数据帧中两个数据帧的行内容

    我正在处理两个 csv 文件并作为数据框 df1 和 df2 导入 df1 有 50000 行 df2 有 150000 行 我想将 df2 的 时间 与 df1 求时间差并返回所有列的值 对应相似的行 保存在df3中 时间同步 例如 35
  • 数独算法,暴力破解[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • 分而治之算法找到两个有序元素之间的最大差异

    给定一个整数数组 arr 找出任意两个元素之间的差异 使得较大的元素出现在 arr 中较小的数字之后 Max Difference Max arr x arr y x gt y 例子 如果数组是 2 3 10 6 4 8 1 7 那么返回值
  • 如何为多边形创建内部螺旋?

    对于任何形状 我如何在其内部创建类似形状的螺旋 这与边界 使用 Minkowski 和 类似 尽管它会是相同形状的螺旋 而不是在形状内部创建相同的形状 我找到了这个 http www cis upenn edu cis110 13su le
  • 什么是“朴素”算法,什么是“封闭式”解决方案?

    我有一些关于描述算法时使用的术语语义的问题 首先 朴素 算法是什么意思 这与给定问题的其他解决方案有何不同 解决方案还可以采取哪些其他形式 其次 我听到很多人提到 封闭式 解决方案 我也不知道这意味着什么 但在尝试解决递归关系时经常会出现
  • 我应该对算法使用递归还是记忆化?

    如果我可以选择使用递归或记忆来解决问题 我应该使用哪一个 换句话说 如果它们都是可行的解决方案 因为它们提供了正确的输出并且可以在我正在使用的代码中合理地表达 那么我什么时候会使用其中一个而不是另一个 它们并不相互排斥 您可以同时使用它们
  • 为什么这个算法的Big-O复杂度是O(n^2)?

    我知道这个算法的大O复杂度是O n 2 但我不明白为什么 int sum 0 int i 1 j n n while i lt j sum 即使我们设定了j n n一开始 我们在每次迭代期间递增 i 并递减 j 因此最终的迭代次数不应该比n
  • 求先递增后递减列表的最大值和最小值

    我尝试用谷歌搜索这个问题 但没有取得太大成功 我确信这个问题或类似问题有一个技术名称 但我似乎找不到答案 给定一个列表L整数 即严格递增 然后严格递减 找到该列表的最大值和最小值 例如 L可能 1 2 3 4 5 4 3 2 or 2 4

随机推荐

  • 如何更改加载浏览器外 Silverlight 3 应用程序的背景颜色?

    在浏览器外运行 Silverlight 3 应用程序时 启动需要一点时间 但时间足够长 足以引起人们的注意 在此启动期间 托管应用程序的窗口的背景显示丑陋的白色背景颜色 在浏览器中运行时 我们有一个启动屏幕 但它当然是通过 JavaScri
  • 查找 bash 中第一列中每个不同值的第 n 列中的最大值

    我有一个 3 列文件 我想找到第三列的最大值 其中行与第一列相同 并且输出中还有第二列 Input 1 234 0 005 1 235 0 060 1 236 0 001 2 234 0 010 2 235 0 003 2 236 0 00
  • 在同一场景中加载新的 fxml

    我有 2 个 fxml 文件 布局 标题 菜单栏和内容 Anchorpane 它应该放置在其他 fxml 文件的内容中 我想知道如何从 Master 场景加载内容空间内的第二个文件 在 javaFX 中工作是一件好事还是加载新场景更好 我正
  • 如何显示视频路径中的视频缩略图?

    我想在 ImageView 中显示存储上视频路径的视频缩略图 是否有一个函数可以获取视频路径并返回缩略图的位图 我通过以下代码获取视频路径 public ArrayList
  • F# 可变列表为空

    当我尝试运行下面的代码时 属性为空 这是为什么 我为属性分配了一个空列表 但第一次通过循环时 它为空 这会导致它删除我附加到它的第一个值 我也不明白这一点 似乎与 null 连接的值应该是该值的列表
  • Grep正则表达式查找可变长度字符串中的数字

    我需要某种方法来查找包含字符和数字的任意组合的单词 但是仅恰好 4 位数字 以及至少一个字符 EXAMPLE a1a1a1a1 Match 1234 NO match no characters a1a1a1a1a1 NO match ab
  • 将自定义包添加到 Azure 机器学习工作室

    我需要使用 azure 机器学习工作室上的函数 tsCV 来评估预测模型 但出现错误 could not find function tsCV 我正在尝试更新预测包 但未加载任何包 我按照这个教程http blog revolutionan
  • 简单的伪随机算法

    我需要一个伪随机生成器 它将一个数字作为输入并返回另一个数字 该数字是可再现的并且似乎是随机的 每个输入数字应与一个输出数字完全匹配 反之亦然 相同的输入数字总是导致相同的输出数字 靠近的连续输入数字 例如 1 和 2 应该产生完全不同的输
  • 为 i18n 设计属性?

    如何翻译 Devise 模型的属性 例如 session email or session remember me 两个层次结构 de devise sessions email E Mail and de activerecord att
  • Java中的“自动递增”字母表?

    Java 中的 自动增量 字母表 这可能吗 从头到尾没有第三方库 是的 你可以这样做 for char alphabet A alphabet lt Z alphabet System out println alphabet 也可以通过类
  • 在同一查询中混合 HQL 和 SQL

    我正在尝试在同一个查询中混合 HQL 和 SQl 喜欢使用 来自 Object 对象 TABLE B tbl 其中 obj simeProp tbl COLUMN 因为我的客户需要修改查询 学习 HQL 或映射未映射的表是不可能的 如果不是
  • SQL,缺少结尾,但为什么呢?

    我对 mySQL 过程有疑问 MySQL Workbench 建议我它错过了我的第一个 SET 的 结束 但没有错过第二个 SET 的 结束 我不知道为什么 DELIMITER drop procedure if exists pay10p
  • 使用 zxing 解码时返回图像中的条形码位置

    在我当前的项目中 我需要知道如何使用 zxing 获取图像中条形码的位置 以像素或像素范围为单位 我的图像源是 Kinect v2 主要目的是将条形码与车身框架关联起来 这需要位置信息 我使用的是标准 Kinect v2 SDK 和 Vis
  • 使用 VS Android 模拟器运行调试时 Xamarin Forms Android 应用程序崩溃

    我创建了一个基本的 Xamarin Forms 应用程序 它在 iOS 模拟器上运行良好 然而 当我尝试使用 VS Android 模拟器 5 1in Marshmallow 运行时 它每次打开时都会崩溃 即使我尝试在没有调试的情况下运行
  • 使用 Java2D 绘制多个圆

    我正在尝试使用Java2D 进行一些简单的图形编程 我开始很简单 只是尝试在 JFrame 中显示几个圆圈 我成功显示了一个圆圈 但是当添加第二个圆圈时 仅显示添加到 JFrame 的最后一个圆圈 我使用 Circle 类来定义我的圆并重写
  • 为什么 Django 站点不能嵌入另一个 HTML(iframe)中?

    我尝试在另一个 html 页面中嵌入 django 表单 但它不起作用 我尝试了其他 django 网站 但没有任何效果 还对其他一些网站进行了测试 django 是否限制在 iframe 中使用 如何让它发挥作用 需要嵌入的表格编程竞赛形
  • 如何为 AngularStrap datetimepicker 显示“无效日期”验证消息

    我能够验证我的 AngularStrap 日期时间选择器 但我无法区分所需的验证失败和无效的日期失败 屏幕上显示的唯一错误是必需的错误 无论它是必需的还是无效的字符串 如果输入的字符串无效 是否可以显示不同的验证消息 这是我的代码 div
  • 从锯齿状数组初始化中省略 c# new

    From http msdn microsoft com en us library 2s05feca aspx http msdn microsoft com en us library 2s05feca aspx 请注意 您不能在元素初
  • 在 WPF TreeView 中对子对象进行分组

    我试图让我的树视图根据相似项目的内容对它们进行分组 为了保持通用 我的对象层次结构可能如下所示 Objects Object Group 1 项目 1 类型 A 项目 2 类型 A 项目 3 类型 B 项目 4 类型 B 现在 我的 Tre
  • 洗牌算法分析

    我遇到了以下洗牌算法的分析 问 给定一个不同整数的数组 给出一个算法来随机 对整数重新排序 以便每个可能的重新排序都是相等的 可能 换句话说 给定一副牌 你如何洗牌 使得任何牌的排列都是同样可能的 好答案 按顺序遍历元素 将每个元素与 数组