统一选择将物品分布放入垃圾箱中

2023-12-26

想象一下你有n物品和m垃圾箱。所有物品都是相同的,但箱子是不同的。随机选择一批物品放入垃圾箱的最快算法是什么?

例如 - 想象一下104是将 5 件物品放入 3 个箱子中。将 5 件物品放入 3 个箱子中,有 21 种可能的放置方式:

005  014  023
032  041  050
104  113  122
131  140  203
212  221  230
302  311  320
401  410  500

对于大量物品和垃圾箱,我应该如何选择放置位置n项目进入m使每个可能的放置都有相同的发生机会?对于给定的n and m选择将会进行很多次。


这是针对两种情况的两种算法。

你有足够的可用内存,你会做很多展示位置。在这种情况下,您可以使用您的记忆来预先计算并存储您的所有可能的位置n项目进入m垃圾箱。如果我们让C(n, r)是以下组合的数量r物品取自n项目,不重复且不考虑顺序,则可能的放置数量为C(m+n-1, m-1)。 (该公式在组合数学中非常标准,并使用星条法 https://en.wikipedia.org/wiki/Stars_and_bars_(combinatorics)#Theorem_two)。在你的例子中,那就是

C(5+3-1, 3-1) = C(7, 2) = 7!/2!/(7-2)! = 7/1*6/2 = 21

(如果 StackOverflow 中提供了 MathJax,我可以使用标准数学符号使其看起来更加漂亮。)在程序的设置中,可以通过一个小型递归例程使用以下想法生成这些位置:placek items (0 <= k <= n)放入第一个垃圾箱,然后将剩余的n-k项目进入剩余m-1垃圾箱。然后每次您想要随机放置时,请选择 1 到 1 之间的随机数C(m+n-1, m-1)并用它作为选择位置的索引。每次额外放置的时间成本只是一次随机数计算和一次数组访问。没有比这更好的了。

您的可用内存很少,您将进行一个或几个放置。然后,您可以使用计算多个组合系数的迭代例程来选择随机放置。

首先,计算一下你的可能的放置数量n项目进入m bins, C(m+n-1, m-1),并选择一个随机数r从 1 到该组合数。让k是要放入第一个垃圾箱的物品数量。届时将会有n-k剩余项目在m-1bins 的数量为C(m+n-k-2, m-2)。现在循环k开始于0。如果这算的话k=0超过或等于r,我们决定设置k=0第一个垃圾箱中的物品。如果没有,增加k减一并减少r通过该组合计数,并为新的组合找到新的组合计数k。如果该计数超过或等于r,我们决定设置k第一个垃圾箱中的物品。如果没有,增加k通过一...你就明白了。当我们选择了一个特定的值k我们替换n with n-k, m with m-1, leave r就像现在一样,然后移动到下一个垃圾箱。

这个的计数是n迭代项目和m通过 bin 进行迭代,对于m+n组合系数的迭代和计算。唯一的内存使用是一些简单的变量和最终的放置m垃圾箱。您需要一个好的组合系数计算器例程。

(稍后添加:我已经完整地编写了这个例程,并找到了一种更好的方法来计算所涉及的概率,而无需找到组合的数量。这样减少了计算时间,完全实现了顺序m+n为了例行公事。这可以减少到订单m如果我能找到一个好的函数来直接找到一个给出一定概率的值,但我找不到这样的函数。如果您愿意获得近乎均匀的展示位置分布而不是完全均匀的分布,我可以找到近似值。)

让我知道如果您想要一些 Python 代码来演示任一例程,但首先要澄清您所处的情况并展示您自己的更多努力。

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

统一选择将物品分布放入垃圾箱中 的相关文章

  • 寻找下一个素数的最佳方法(Java)

    我被要求编写一个程序以最佳方式找到下一个素数 我编写了这段代码 但找不到最佳答案 有什么建议么 public static int nextPrime int input input now find if the number is pr
  • 对矩阵进行舍入,保留行和列总计

    想要 以保留行和列总计的方式对矩阵进行舍入的 伪 代码 问题从向量开始 X and Y of 非负整数 with Sum X Sum Y 想要圆X Y Sum X 同时保留行和列总计 这是婚姻问题的一种 Xa需要进行一定次数的握手 拨打该号
  • 为什么《破解编码面试》这个例子的时间复杂度是O(k c^k)?

    该问题来自 破解编码面试 第 6 版 问题 V1 11 以下代码打印长度为 k 的所有字符串 其中字符 是按排序顺序排列的 它通过生成所有长度的字符串来做到这一点 k 然后检查每个是否已排序 什么是运行时间 package QVI 11 P
  • 正则表达式匹配不可约分数

    我怎样才能匹配不可约分数 http en wikipedia org wiki Irreducible fraction用正则表达式 例如 23 25 3 4 5 2 100 101 等 首先 我不知道正则表达式中的gcd算法实现 Upda
  • 当平方和为N时,如何找到四个变量的所有可能值?

    A 2 B 2 C 2 D 2 N给定一个整数N 打印出整数值的所有可能组合ABCD求解方程 我猜我们可以比暴力做得更好 天真的暴力会是这样的 n 3200724 lim sqrt n 1 for a 0 a lt lim a for b
  • 处理流星中的长服务器端计算

    我正在使用 jimp https www npmjs com package jimp https www npmjs com package jimp 在meteor JS中生成图像服务器端 换句话说 我正在使用递归算法 计算 图像的像素
  • 查找文本中所有关键字的有效算法

    我有很多字符串 其中包含许多不同拼写的文本 我通过搜索关键字来标记这些字符串 如果找到关键字 我将使用该关键字的关联文本 假设搜索字符串可以包含文本 schw schwa 和 施瓦茨 我有三个关键字 全部解析为文本 schwarz 现在我正
  • 简单的排名算法

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

    有人知道如何检查有效的 IMEI 吗 我找到了一个可以检查此页面的功能 http www dotnetfunda com articles article597 imeivalidator in vbnet aspx http www do
  • 自动跟踪算法

    我正在尝试写一个simple跟踪例程来跟踪电影中的某些点 本质上我有一系列 100 帧长的电影 在黑暗背景上显示一些亮点 我每帧有大约 100 150 个点 它们在电影的过程中移动 我想跟踪它们 所以我正在寻找一些有效的 但可能不会过度实施
  • 在任意时间范围内找到最佳日/月/年间隔的算法?

    如果您有时间表 请说 March 19 2009 July 15 2011 是否有一种算法可以将该时间范围分解为 March 19 2009 March 31 2009 complete days April 1 2009 December
  • “包含字符串”的快速索引

    在我的应用程序中 我有多达数百万个短字符串 大部分短于 32 个字符 我想实现一个带有附加列表的搜索框 该列表仅包含包含在搜索框中输入的整个字符串的元素 如何预先建立索引来快速找到此类字符串 所有排序的 STL 容器都会检查整个字符串 对于
  • heapq.nlargest 的时间复杂度是多少?

    我在看演讲者说 获得t列表中最大的元素n元素可以在O t n 这怎么可能 我的理解是创建堆将是O n 但是复杂度是多少nlargest本身就是O n t or O t 实际的算法是什么 在这种情况下 说话者是错误的 实际成本是O n log
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 优化计算中使用的 # 个线程的算法

    我正在执行一个操作 我们将其称为CalculateSomeData CalculateSomeData 在连续的 代 中运行 编号为 1 x 整个运行中的代数由CalculateSomeData 的输入参数固定 并且是先验已知的 完成一次生
  • 使用什么算法来确定使系统达到“零”状态所需的最小操作数?

    这是一种更通用的问题 不是特定于语言的 有关要使用的想法和算法的更多信息 系统如下 它登记朋友群体之间的小额贷款 Alice and Bill要去吃午饭 比尔的卡坏了 所以爱丽丝支付了他的餐费 10 美元 第二天Bill and Charl
  • JavaScript 中的埃拉托斯特尼筛法对大量数据无限运行

    我一直在尝试写埃拉托斯特尼筛法 http en wikipedia org wiki Sieve of EratosthenesJavaScript 中的算法 基本上我只是按照以下步骤操作 创建从 2 到 n 1 的连续整数列表 令第一个素
  • 测试 python Counter 是否包含在另一个 Counter 中

    如何测试是否是pythonCounter https docs python org 2 library collections html collections Counter is 包含在另一个中使用以下定义 柜台a包含在计数器中b当且
  • 删除近排序数组中未排序/离群元素

    给定一个像这样的数组 15 14 12 3 10 4 2 1 我如何确定哪些元素乱序并删除它们 在本例中为数字 3 我不想对列表进行排序 而是检测异常值并将其删除 另一个例子 13 12 4 9 8 6 7 3 2 我希望能够删除 4 和

随机推荐

  • 如何在C#中强制退出应用程序?

    我有一个多线程 C 应用程序 它有读写器锁 但它在某些计算机上给出超时异常 无法及时获取锁 我需要强制关闭所有线程 我该如何做到这一点而不会出现任何额外的异常 我认为强制应用程序退出的最佳解决方案是使用以下代码行 Environment E
  • 子目录中的递归 make

    我怎样才能订购makeMakefile中的命令在所有子目录中递归执行make命令 在子目录的 Makefile 中定义 Read 递归使用 Make http www gnu org software make manual make ht
  • 如何从 Perl 中的逗号分隔值中提取值?

    我有一个日志文件 其中包含来自不同服务器的统计信息 我仅使用正则表达式将统计信息与此日志文件分开 我正在尝试从正在运行的进程中捕获 CPU 使用情况 对于 SunOS 我有以下输出 process 10050 user1 218 59 0
  • 是否可以将 python 子进程的输出实时流式传输到网页?

    预先感谢您的任何帮助 我对 python 相当陌生 对 html 甚至更新 过去几天我一直在尝试创建一个带有按钮的网页 以在家庭服务器上执行任务 目前我有一个 python 脚本 它生成一个带有按钮的页面 See the simplifie
  • 正向索引 vs 倒排索引 为什么?

    我正在阅读有关倒排索引 由 Solr Elastic Search 等文本搜索引擎使用 的内容 据我了解 如果我们以 Person 为例 属性与 Person 的关系是倒置的 John gt PersonId 1 PersonId 2 Pe
  • 从 Sentinel C# 获取 Redis Master 地址

    我正在尝试使用哨兵来获取我的主站的连接地址 问题是哨兵仅在故障转移时发送地址 但是如果我的主站关闭并且从站被提升为主站并且我的应用程序刚刚启动它就不会知道并且不会收到原来master宕机的消息 有什么办法可以和sentinel通信并询问他认
  • 插入到JPA集合而不加载它

    我目前正在使用这样的代码将新条目添加到我的实体中的集合中 player em find Player class playerId player getAvatarAttributeOwnership add new AvatarAttri
  • 在反应本机中多个文本元素的文本换行?

    假设我有以下反应本机代码 FormatText js
  • 使用Android.mk复制/system中的多个txt文件

    目标 我想复制multiple使用 Android mk 在 system Android 设备 中创建 txt 文件 我的发现 我们可以使用两种方法复制文件 1 使用 PRODUCT COPY FILES 这是通过 devices mak
  • Excel文件对比pandas 中的 read_excel

    我正在深入研究熊猫并进行实验 至于从Excel文件中读取数据 我想知道使用 ExcelFile 和 read excel 有什么区别 两者似乎都有效 尽管语法略有不同 正如预期的那样 并且文档支持两者 在这两种情况下 文档描述的方法相同 将
  • OSX 应用程序崩溃:代码签名无效

    我有一个在 App Store 之外分发的 OSX 应用程序 因此 我使用相应的证书 开发人员 ID 应用程序证书 对其进行签名 该应用程序本身是用 Freepascal Lazarus 编写的 并且有一个用 C 编写的依赖库 我也对其进行
  • 使用代理将虚拟列添加到 Qt SQL 模型

    我使用以下命令在视图中显示 SQL 表QSql表模型 我想根据行数据显示附加状态列 为此我使用自定义Q身份代理模型我在哪里增加列数并返回data对于该新的虚拟列 该列不存在于QSql表模型 int MyProxyModel columnCo
  • 如何覆盖默认的窗口关闭操作?

    在 WPF 中 我想更改某些窗口的默认关闭行为 以便当用户单击红色关闭按钮时窗口不会关闭 它只是隐藏 并调用一些方法 我怎样才能做到这一点 尝试重写 Window xaml cs 中的 OnClosing private override
  • Xcode 4:如何自定义文件模板和项目模板?

    在 Xcode 3 中 我们 通过反复试验 发现我们可以将系统模板复制到新位置 三个可能的位置 因为 Apple 不断更改它 并自定义它们 注意 在写这个问题时 我发现 StackOverflow 上关于这个主题的大多数答案都是不正确的 A
  • .NET:将日期时间转换为十进制

    在 SQL Server T SQL 中 您可以将 DateTime 变量转换为十进制值 如下所示 CONVERT DECIMAL 20 10 mytime Sample Input 2012 07 27 08 29 20 000 Samp
  • 无法使用类型属性选择器在 IE7 中设置新的 HTML5 输入类型的样式

    看来即使使用 shivs 你也不能做类似的事情input type search 在 IE7 中设置新的 HTML5 输入元素的样式 您可以在以下位置查看示例http jsfiddle net 2tmAp http jsfiddle net
  • 使用“AJAX”下载 CSV 文件

    我正在尝试为我的网站完成一项相当简单的任务 但我不确定具体如何去做 我希望用户查看一个表格 然后单击一个按钮 此时用户可以保存该表格该表的内容作为 csv 文件 此请求有时可能非常复杂 因此我生成一个进度页面来提醒用户 除了实际生成 csv
  • 使用 BeautifulSoup 选择所有 div 兄弟姐妹

    我有一个 html 文件 其结构如下 div div div div div div div div div div div div div div 我想选择所有兄弟 div 而不选择第三个和第四个块中的嵌套 div 如果我使用find a
  • 竞争条件:整数的最小和最大范围

    我最近在一次采访中被问到这个问题 给定以下代码 静态整数的最小和最大可能值是多少num import java util ArrayList import java util List public class ThreadTest pri
  • 统一选择将物品分布放入垃圾箱中

    想象一下你有n物品和m垃圾箱 所有物品都是相同的 但箱子是不同的 随机选择一批物品放入垃圾箱的最快算法是什么 例如 想象一下104是将 5 件物品放入 3 个箱子中 将 5 件物品放入 3 个箱子中 有 21 种可能的放置方式 005 01