限制性安排的数量

2024-03-28

我正在寻找一种更快的方法来解决这个问题:

假设我们有n boxes and n 弹珠(他们每个人都有不同的种类)。每个盒子只能包含某种弹珠(如下例所示),并且只有一个大理石适合装在一个盒子里. 请阅读编辑内容。整个算法已在下面链接的帖子中进行了描述,但没有精确描述,所以我要求重新解释。

问题是:我可以通过多少种方式在多项式时间内将弹珠放入盒子中?

Example:

n=3

Marbles: 2,5,3

Restrictions of the i-th box (i-th box can only contain those marbles): {5,2},{3,5,2},{3,2}

The answer: 3, because the possible positions of the marbles are: {5,2,3},{5,3,2},{2,5,3}

我有一个在 O(2^n) 中工作的解决方案,但它太慢了。关于盒子容差还有一个限制,我认为这不是很重要,但我也会写它们。每个盒子都有自己的种类限制,但有一个所有盒子都接受的种类列表(在上面的示例中,广泛接受的种类是 2)。

Edit:我刚刚发现这个问题,但我不确定它是否适合我的情况,并且动态解决方案没有得到很好的描述。有人可以澄清这一点吗?这个问题4年前就已经回答了,所以我不会在那里问。https://math.stackexchange.com/questions/2145985/how-to-compute-number-of-combinations-with-placement-restrictions?rq=1 https://math.stackexchange.com/questions/2145985/how-to-compute-number-of-combinations-with-placement-restrictions?rq=1

Edit#2:我还必须提到,除了广泛接受的列表之外,一个盒子的接受列表的最大大小有 0、1 或 2 个元素。

Edit#3:这个问题参考了我之前的问题(允许的数字 1 到 N 的排列 https://stackoverflow.com/questions/69740876/allowed-permutations-of-numbers-1-to-n),我发现这太笼统了。我附上此链接是因为还有一个更重要的信息 - 可以放置弹珠的盒子之间的距离不大于 2。


正如评论中指出的那样,https://cs.stackexchange.com/questions/19924/counting-and-finding-all-perfect-maximum-matchings-in-general-graphs https://cs.stackexchange.com/questions/19924/counting-and-finding-all-perfect-maximum-matchings-in-general-graphs就是这个问题,其中包含有关如何解决该问题的论文链接,并且计算匹配的数量是#P-complete。我建议找到那些论文。

至于动态规划,只需编写一个递归解决方案,然后将其记住即可。 (这是自上而下的,而且几乎总是更简单的方法。)对于固定(且相当少)数量的框的堆栈交换问题,该方法是易于管理的。不幸的是,在您的带有大量盒子的变体中,天真的递归版本看起来像这样(未经测试,可能有错误):

def solve (balls, box_rules):
    ball_can_go_in = {}
    for ball in balls:
        ball_can_go_in[ball] = set()
    for i in range(len(box_rules)):
        for ball in box_rules[i]:
            ball_can_go_in[ball].add(i)

    def recursive_attempt (n, used_boxes):
        if n = len(balls):
            return 1
        else:
            answer = 0
            for box in ball_can_go_in[balls[n]]:
                if box not in used_boxes:
                    used_boxes.add(box)
                    answer += recursive_attempt(n+1, used_boxes)
                    used_boxes.remove(box)
             return answer

    return recursive_attempt(0, set())

为了记住它,你必须构造新的集合,也许使用位字符串,但是你会发现你正在用 n 个事物的子集来调用它。它们的数量呈指数级增长。不幸的是,这将花费指数时间并使用指数内存。

如果用 LRU 缓存替换记忆层,您可以控制它使用的内存量,并且可能仍然可以从记忆中获得一些好处。但最终你仍然会使用指数或更差的时间。

如果你走这条路,一个实用的技巧是根据球放入盒子的数量对球进行分类。你想从尽可能少的选择开始。由于这是试图降低指数复杂性,因此在这个排序步骤上做大量的工作是值得的。所以我会首先选择进入盒子最少的球。然后我接下来会选择进入新盒子最少的球,并以最少的总数打破平局。第三个球将是最少的新盒子,以最少的第一个球未使用的盒子打破平局,以最少的盒子打破平局。等等。

这个想法是尽早产生和发现被迫的选择和冲突。事实上,这一点非常重要,值得每一步都进行搜索,尝试发现和记录已经可见的被迫选择和冲突。这感觉违反直觉,但确实有所作为。

但是,如果您完成所有这些,适用于 5 个盒子的动态编程方法将会变得更快,但您仍然只能处理比简单解决方案稍大的问题。因此,请查看研究,寻找比这种动态规划方法更好的想法。

(顺便说一句,包含-排除方法对每个子集都有一个术语,因此它也会呈指数级增长。)

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

限制性安排的数量 的相关文章

  • 不分配内存的重复排列

    我正在寻找一种算法来生成列表中重复 4 个元素 长度 2 1000 的所有排列 Java实现 http en literateprograms org Permutations with repetition 28Java 29 问题是上面
  • 所需的最少攻击次数[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我们有一个二维的细胞网格 每个细胞可能包含也可能不包含怪物 我们得到了包含怪物的单元格列表 在一次攻击中 我们可以杀死所有排成一排或一列的
  • 计算产生相同 BST 的唯一节点序列的数量

    问题 给定一个最多 50 个整数的特定序列 它们代表 某个二叉搜索树 BST 的节点 有多少种排列 这个序列在那里 这也会产生完全相同的 空白石板时间 将原始序列作为 1 个序列包含在总计数中 例如 对于这样的序列 5 2 1 9 8 答案
  • 计算流数据的直方图 - 在线直方图计算

    我正在寻找一种算法来生成大量流数据的直方图 最大值和最小值事先未知 但标准差和平均值在特定范围内 我很欣赏你的想法 Cheers 我刚刚找到了一个解决方案 秒 从流式并行决策树算法构建在线直方图 论文的 2 2 该算法由 Hive 项目中的
  • 用于检索编辑距离接近的字符串的数据结构

    例如 从一组英语单词开始 是否有一种结构 算法允许使用单词 right 作为查询来快速检索诸如 light 和 tight 之类的字符串 即 我想检索与查询字符串编辑距离较小的字符串 The BK tree http blog notdot
  • 自动适合衣服的算法?

    想象一下 客户要求您设计一款软件 以满足一些相当粗略的规格 如下所示 1 它将面向时尚行业营销 2 用户将是 设计衣服和东西 的人 可能有一个特定的术语 但我没有想到 3 由于各种原因 能够快速制作原型设计并查看它们在模型上的外观会很有用
  • 我怎样才能找到圆的所有点? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 给定半径和圆心坐标 如何找到圆的所有
  • 生成总和为 N 的所有数字排列

    我正在编写一个程序来创建所有数字 起初 我尝试使用分区函数对数字进行分区 然后对每个数字集进行排列 但是我认为这行不通 最好的方法是递归排列 同时对数字求和 这超出了我的能力范围 抱歉 如果这听起来真的很愚蠢 但我真的不知道 Example
  • 使用回溯(而不是 DFS)背后的直觉

    我正在解决单词搜索 https leetcode com problems word search description LeetCode com 上的问题 给定一个 2D 板和一个单词 查找该单词是否存在于网格中 该单词可以由顺序相邻单
  • 将区间映射到更小的区间的算法

    我尝试搜索 但由于问题的性质 我无法找到满意的内容 我的问题如下 我试图将 0 到 2000 范围内的数字 尽管理想情况下上限是可调的 映射到 10 到 100 范围内的更小的区间 上限将映射 2000 gt 100 和下限也是如此 除此之
  • 如何在代码生成过程中简化包含变量的 C 风格算术表达式?

    我正在尝试优化编译器中的表达式求值 算术表达式都是C风格的 并且它们可以包含变量 我希望尽可能简化表达 例如 3 100 A B 100 3 100可以简化为409 300 A B 主要取决于分配律 结合律和交换律 我遇到的主要困难是如何将
  • 在 Python 中删除表达式树及其每个子表达式树中第一个元素周围的括号

    目标是实现简化操作 删除表达式树及其每个子表达式树中第一个元素周围的括号 其中表达式作为括在各个括号中的字符串输入给出 这必须适用于任意数量的括号 例如 12 3 45 6 gt 123 45 6 删除 12 周围的括号 然后删除 45 周
  • 如何检查一个盒子是否适合另一个盒子(允许任何旋转)

    假设我有两个盒子 每个盒子都是一个长方体 http en wikipedia org wiki Rectangular cuboid aka长方体 我需要编写一个函数来决定盒子是否具有尺寸 一 二 三 可以装入具有尺寸的盒子中 甲 乙 丙
  • 给定与总和匹配的长度的唯一 3 位数字 (-1,0,1) 序列的数量

    假设您有一个长度为 n 即空格数 的垂直游戏板 你有一个三面骰子 有以下选项 前进一 停留和后退 如果您低于或高于棋盘游戏空间的数量 则该游戏无效 一旦到达棋盘末端 唯一有效的动作就是 停留 给定确切的骰子投掷次数 t 是否可以通过算法计算
  • 添加到数组连续数字

    这是我向SO提出的第一个问题 我希望能答对 在 PHP 中 如果你不会 Python 或伪语言也可以 给定一个包含 n 个元素的数组 old array 1 2 3 5 7 8 9 20 21 23 29 我需要向新数组添加连续数字 如果不
  • 稀疏矩阵中的最大和子矩形

    求一个子矩形中的最大和NxN矩阵可以完成O n 3 正如其他帖子中指出的 使用 2 d kadane 算法的时间 然而 如果矩阵是稀疏的 具体来说O n 非零条目 可以O n 3 时间被打败了吗 如果有帮助的话 对于我感兴趣的当前应用程序
  • 如何设置K-means openCV c++的初始中心

    我正在尝试使用 OpenCv 和 Kmeans 对图像进行分割 我刚刚实现的代码如下 include opencv2 objdetect objdetect hpp include opencv2 highgui highgui hpp i
  • 如何在Scala中实现尾递归快速排序

    我写了一个递归版本 def quickSort T xs List T p T T gt Boolean List T xs match case Nil gt Nil case gt val x xs head val left righ
  • 合并字符数组中的最小重复次数

    假设我有两个数组 我想合并它们 以便合并后的数组具有最小重复次数 例如 x x 是重复 arr1 x d d m f m arr2 d d x f f m 唯一的条件是在合并数组中 元素来自arr1 and arr2必须出现在各自的订单中a
  • 反转二进制网络

    如何反转二元方程 以便找到哪些输入将产生给定的输出 Example Inputs i0 through i8 Outputs o0 through o8 Operators XOR AND 二元方程 1 i0 1 i1 0 i2 1 i3

随机推荐

  • MySQL 更新触发器 - 查找更改的列?

    我有一个有 120 列的表 我需要设置审计跟踪 如果发生更改 它将记录任何列 就像现在一样 我想我必须为每一列设置一个具有如下条件的触发器 IF NEW columnName OLD columnName THEN log the old
  • 使用正则表达式提取 r ngram

    卡尔 布罗曼的帖子 https kbroman wordpress com 2015 06 22 randomized hobbit 2 https kbroman wordpress com 2015 06 22 randomized h
  • Numpy 查找具有相同值的组的索引

    我有一个由 0 和 1 组成的 numpy 数组 y 1 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 1 我想计算 1 或 0 组的索引 因此 对于上面的示例 一组的结果应该类似于 result 0 2 8 9
  • 混合jpa继承策略-inheritanceType.JOINED与inheritanceType.SINGLE_TABLE

    我的类结构如下所示 我在这里实现了两个单独的策略 但根类的继承策略 即 InheritanceType JOINED 正在整个层次结构中使用 Entity Inheritance strategy InheritanceType JOINE
  • ORACLE 索引表上的插入性能

    为什么 Insert 语句在索引表上执行速度较慢 这实际上是同一类问题 为什么需要更多时间才能将所有杂货放在厨房的正确位置 而不是在逛完杂货店后把所有东西都留在袋子里 这是因为在存放杂货时 您希望将它们放在一个漂亮且众所周知的位置 以便以后
  • 使用 UMD 捆绑包捆绑 Angular 2 应用程序(不构建供应商捆绑包)

    我目前正在将我的 Angular 2 应用程序与 WebPack 捆绑在一起 我们仍在快速循环 因此我们不想增加构建和应用程序加载过程的延迟 而是希望包含很少变化的 Angular 2 UMD CDN 准备的捆绑包 例如
  • PySpark 输出文件数量

    我是 Spark 新手 我有一个简单的 pyspark 脚本 它读取 json 文件 将其展平并将其作为 parquet 压缩文件写入 S3 位置 读取和转换步骤运行得非常快 并使用 50 个执行器 我在 conf 中设置 但写入阶段耗时较
  • Devise::PasswordsController#create 中的 EOFError

    我在从 Ruby on Rails 应用程序发送邮件重置密码时遇到了问题 密码重置邮件过去可以使用 但现在不行了 密码重置是服务器发送的唯一电子邮件 一旦我提交了我想要获取密码的电子邮件 Rails 就会显示完整的跟踪信息 Devise P
  • 防止只读文本框在 Silverlight 中变灰

    在 Silverlight 中 如何制作文本框IsReadOnly True 不会变灰 我的应用程序的灰色效果看起来很糟糕 我想禁用它 或更改其外观 颜色 Silverlight 2 中有几个选项 最简单的是使用 TextBlock 因为它
  • NumPy:计算累积中位数

    我有大小 n 的样本 我想计算每个 i 1 sample i 在 numpy 例如 我计算了每个 i 的平均值 cummean np cumsum sample np arange 1 n 1 我可以在没有循环和理解的情况下对中位数做类似的
  • 即使没有上传输入文件,Laravel mimes 验证也总是被调用(未使用必需规则)

    我仅对文件输入字段使用单一验证规则 这就是哑剧规则 如果没有上传文件 我想跳过此规则 所以我没有使用 必需 规则 但即使没有上传文件 它也始终显示 mime 类型消息 我刚刚添加了测试所需的规则 当时它显示了所需的错误消息 仅当使用 aja
  • 从 Rails 中的单表继承获取子类的列表/数组?

    我有一大堆子类 它们通过 Rails 应用程序中的单表继承从父类继承 我想要一种方法来获取从主类继承的所有子类的数组 我尝试了在另一个 SO 答案中找到的以下单链接命令 但它只返回父类 ObjectSpace each object cla
  • 为什么

    我有一个简单的 html 页面 其中有一些样式 我不明白为什么要添加一些上边距 这是来源
  • 是否可以递归刷新 CQ5/AEM apache 调度程序中的目录?

    由于多租户情况下的特定项目 我有一个调度程序设置了相当深的统计文件级别 我希望找到一种能够递归刷新目录的方法 以模仿其他租户的更浅的统计文件级别 是否有调度程序刷新命令允许我显式删除内容目录 您可以通过向调度程序发送简单的 GET 请求来自
  • FileStream 似乎没有启用

    在我们的开发数据库之一上 我尝试启用 FileStream 我运行了下面的脚本 据说它从 0 禁用变为 2 启用 Use FileStreamTest GO EXEC sp configure filestream access level
  • 实体框架视频教程[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有免费的视频教程深入讨论 EF 而不仅仅是基础知识 Thanks 下面的视频是我看过的关于实体框架
  • 为什么DATETIME可以减整数,但DATE类型不能减

    DATETIME INTEGER 和 DATE INTEGER 的关系是否一致 这执行得很好 DECLARE Yesterday DATETIME GETDATE SELECT Yesterday 1 就像这样 DECLARE Yester
  • 如何有效地检查同一个表中的两列是否是一对一映射?

    即使不同值计数相等 也并不一定意味着一对一的映射关系 SELECT COUNT DISTINCT Column A FROM MyTable SELECT COUNT DISTINCT Column B FROM MyTable A 列 1
  • 通过 json_encode 传递日语字符(UTF-8)的问题

    我在通过 json encode 将日语字符从 PHP 传输到 JavaScript 时遇到问题 这是从 csv 文件读取的原始数据 PRODUCT1 QA PRODUCT2 QA a PRODUCT3 QA 1 问题是 当通过 echo
  • 限制性安排的数量

    我正在寻找一种更快的方法来解决这个问题 假设我们有n boxes and n 弹珠 他们每个人都有不同的种类 每个盒子只能包含某种弹珠 如下例所示 并且只有一个大理石适合装在一个盒子里 请阅读编辑内容 整个算法已在下面链接的帖子中进行了描述