当前位置: 首页 > 知识库问答 >
问题:

随机化队列实现-随机化思想

陆俊智
2023-03-14

我正在Coursera学习算法课程。其中一项任务如下:

随机队列。随机化队列类似于堆栈或队列,不同之处在于移除的项是在数据结构中的项之间统一随机选择的。

我试图找到一种方法,在固定的时间内实现出列(随机删除项目)。我想到了一个主意,就是重新要求一个deque(它支持在固定时间内从前面和后面删除和添加一个项目)。我的想法如下:

  • 在随机化队列中使用deque作为底层数据结构
  • 加入-使用库函数生成0到1之间的整数。如果整数为0,则将项目添加到deque的前面。否则,将其添加到后面。
  • 出发-任何方向都可以。

随机性发生在排队中而不是在出列中的原因是,我发现它不是完全随机的(例如,对排队的n个调用将使出列只返回第一个或第n个项目)。所以为了确保这些物品被随机移除,我决定将它们随机排队。

这个想法对我来说似乎很好,因为我找不到其中的漏洞,但问题是我无法证明我的想法真的有效。我对随机性知之甚少。事实上,这只是我第五次使用随机数据结构。

我的想法对吗?它会生成一个随机删除项的数据结构吗?

共有2个答案

孙财
2023-03-14

我不认为你提议的方法会起作用,因为一致性要求。一致性意味着队列中的每个项目都有相等的退出队列的可能性。您的建议总是在其中一端添加元素,并从一端或另一端退出。因此,在任何给定的退出请求中,非结束元素被选择的可能性为零。

另一种方法可能是使用基于数组的堆栈。在堆栈的末尾添加元素,但要退出队列,请随机选择一个元素,将其与最后一个元素交换,然后将其弹出。这将具有选择的一致性,并且所有组件操作都是恒定时间。

段干弘扬
2023-03-14

仅在末端排队不会产生均匀随机序列。最后一个要排队的项目必然在两端,排队后第一个要排队的项目更有可能在中间的某个地方,而不是在其他项目的两端。

举例来说,以三个项目集{1,2,3}为例,这是不导致均匀分布的最小集合。按该顺序将其排队将产生以下可能结果(括号中是下一项排队的位置)。

[1] -> (front) -> [1, 2] -> (front) -> [1, 2, 3]
[1] -> (front) -> [1, 2] -> (back) -> [3, 1, 2]
[1] -> (back) -> [2, 1] -> (front) -> [2, 1, 3]
[1] -> (back) -> [2, 1] -> (back) -> [3, 2, 1]

这四个结果是唯一的可能性,并且都具有同等的可能性。正如你所看到的,最后一个项目从来没有在中间,而第一个项目和第二个项目都在中间两次。

你想要的是在一个随机的地方排队。但是您不需要保留其他项的顺序,因为它们是均匀分布的。这意味着您可以将最后一个项目与随机项目交换,然后将该项目(成为最后一个项目)出列。

 类似资料:
  • 有时,计算结果不可预测会很有趣。 徽标提供随机程序以生成随机数。 它有一个参数并产生一个随机均匀选择的整数值,该值大于或等于0且小于其参数的值。 因此,如果您想要一个0到359度之间的随机角度,您可以使用命令random 360来生成它。 请记住,除非您对结果执行某些操作(例如打印),否则徽标将显示错误。 让我们看看下面的例子 - 我们发出了命令 - 在上面的命令窗口中多次print random

  • 问题内容: 我有一个像这样的数组: 如何将其随机/随机播放? 问题答案: 实际无偏混洗算法是Fisher-Yates(aka Knuth)。

  • 本文向大家介绍JavaScript数组随机排列实现随机洗牌功能,包括了JavaScript数组随机排列实现随机洗牌功能的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript数组随机排列实现随机洗牌功能的方法。分享给大家供大家参考。具体分析如下: 这段JS代码可以对数组内的元素进行随机排列,这个非常有用,比如我们在玩扑克牌的时候可以让扑克牌进行排列,也就是电脑洗牌。 希望本文所

  • 我目前正在研究普林斯顿算法第一部分的队列分配。其中一个任务是实现随机队列。这是一个关于使用不同数据结构的实现和权衡的问题。 问题: 随机化队列类似于堆栈或队列,只是从数据结构中的项中均匀随机地选择删除的项。创建实现以下API的通用数据类型: 这里的问题是实现de队列操作和迭代器,因为de队列删除并返回随机元素,迭代器以随机顺序迭代队列。 1.数组实现: 我考虑的主要实现是数组实现。除了随机性之外,

  • 目前,我已将数字按特定顺序排列。我怎么能把这个随机化呢?例如,每次单击按钮时,我希望每个按钮都更改按钮的所有位置。问题是GridPane可以将节点堆叠在一个地方,使得按钮相互隐藏。有没有办法设置节点不能堆栈? 另一方面,我从一个帖子中找到了一个方法,有人想要切换两个按钮的位置。代码如下所示: 我尝试创建一个包含节点的arraylist,然后使用Math.random从arraylist中获取一个随

  • 一个数组中有10个加权元素。我想随机选择一个元素N次,然后计算每个元素出现的次数。是否有一种算法可以在不需要选择N次的情况下为我提供元素计数<代码>N可能是一个很大的数字,在这种情况下,必须生成N个样本是低效的。 例如:一个盒子里有2个红色的球和8个白色的球。从盒子里随机挑选一个球,然后放回去,重复100次。计算拾取红色球或白色球的总次数。 我想知道是否有可能在不进行100次采样的情况下获得计数。