算法 - 找到代表所有行的最小单元格子集

2023-12-25

我有几个列表,您可以将它们视为整数行。 例如 :

[1 3 5]
[3 7]
[3 5 7]
[1 5 9]
[3 9]
[1 7]
[5 9 11]

我希望找到这些行上表示的最小可能的整数集,以便:

  • 每行至少有一个选定的整数,
  • 如果存在基数关系,请选择总和最高的集合。

在我的示例中,我相信结果应该是 [5 7 9] (首选 [3 5 7] 或 [1 3 11] 或......许多可能性)。

第二部分很简单(选择最高和),但是基数中所有最小子集的生成似乎很困难。

你知道实现这一目标的好方法吗?

Edit

数据大小随着迭代缓慢增长,但我需要精确匹配。


最小基数版本是 NP 完全的。设置封面 http://en.wikipedia.org/wiki/Set_cover_problem可以简化为这样。要求其中的最大值只会使问题变得更加困难。

顺便说一句,谈论布尔可满足性的另一个答案是wrong!您需要减少此问题的布尔可满足性以显示 NP 完备性,而不是相反。

设置封面基本上是:

给出集合 S1, S2, ... Sn 的集合 X 的子集,找到其并集涵盖 S1 U S2 U ... U Sn 中的所有元素的最小子集合(就集合数量而言) 。

为了减少我们的问题,

设 S = S1 U S2 ... U Sn。 = {x1, x2, ..., xm}

令 C_i = { j 使得 xi 在 Sj 中 }

将 C_i 提供给我们的问题。

现在,如果我们的问题可以在多项式时间内解决,并且我们可以找到 C_i 元素的最小基数集,那么我们可以找到 Si 的集合覆盖,反之亦然。

这通常可以作为整数规划问题来解决(这也是 NP-Hard)。

对于近似解,这可以被视为线性规划问题(具有多项式时间算法),并且可以进行随机舍入以将小数值(LP 的解)转换为整数。

另外,不幸的是,事实证明,即使是接近一个常数因子,这也是 NP 困难的(事实上我相信它是 O(logn))。

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

算法 - 找到代表所有行的最小单元格子集 的相关文章

  • 最小硬币找零问题——回溯

    我正在尝试用最少数量的硬币解决硬币找零问题 采用回溯法 我实际上已经完成了它 但我想添加一些选项 按其单位打印硬币数量 而不仅仅是总数 这是我下面的Python代码 def minimum coins coin list change mi
  • 链表分区函数及反转结果

    我编写了这个 F 函数来将列表分区到某个点并且不再进一步 很像之间的交叉takeWhile and partition let partitionWhile c l let rec aux accl accr match accr with
  • 如何从单链表的末尾找到第n个元素?

    以下函数试图找到nth to last单链表的元素 例如 如果元素是8 gt 10 gt 5 gt 7 gt 2 gt 1 gt 5 gt 4 gt 10 gt 10那么结果是7th到最后一个节点是7 任何人都可以帮助我了解这段代码是如何工
  • 需要创建一个“选择你自己的冒险”类型的指南 - 最佳使用方法

    基本上需要询问用户一系列问题并收集信息 每个问题都可能对以后的不同问题产生影响 另一个例子是涡轮税的网络界面 在某些 上回答 是 可能会引发未来的问题 似乎这在软件中是一个相当常见的问题 所以我想我是在问是否有任何现有的解决方案 设计模式可
  • 协作投票算法的用户分布

    我的应用程序 实际上是一个游戏 的用户回答问题即可获得积分 问题由其他用户提供 由于数量有限 我无法亲自检查所有内容 因此我决定将过滤过程众包给用户 玩家 规则很简单 每个用户都会看到一个问题来评价好 坏 不确定 当问题被评为 差 5 次时
  • 复合模式/实体系统与传统OOP

    我正在开发一个用 Java 编写的小游戏 但问题与语言无关 由于我想探索各种设计模式 所以我迷上了复合图案 http en wikipedia org wiki Composite pattern 实体系统 我最初读到的here http
  • 在地图元素上使用 for_each

    我有一个映射 我想在其中对每个数据类型对象成员函数执行调用 我还知道如何在任何序列上执行此操作 但是是否可以在关联容器上执行此操作 我能找到的最接近的答案是 Boost Bind 访问 std for each 中的 std map 元素
  • 滑动窗口最小算法

    这是一个家庭作业问题 设 A 是一个整数数组和整数 K 窗口大小 当窗口滑过 A 时 生成在窗口中看到的最小值的数组 M 我发现一篇文章 http home tiac net cri 2001 slidingmin html有这个问题的解决
  • 四舍五入到最接近的 2 的幂

    是否有一个单行表达式 可能是布尔值 来获取最接近的2 n给定整数的数字 示例 5 6 7 必须是 8 四舍五入到下一个更高的二的幂 参见一些小技巧 http graphics stanford edu 7Eseander bithacks
  • Python 中聚类相似字符串的算法?

    我正在编写一个脚本 该脚本当前包含多个 DNA 序列列表 每个列表都有不同数量的 DNA 序列 并且我需要根据汉明距离相似性对每个列表中的序列进行聚类 我当前的实现 目前非常粗糙 提取列表中的第一个序列并计算每个后续序列的汉明距离 如果它在
  • 什么是日历队列?

    我正在致力于构建一个离散事件模拟器 维基百科提到有几种通用优先级队列非常适合在 DES 中使用 具体来说 它提到日历队列是一个很好的结构 我找到了一份 pdf 1988 年的 其中提到了日历队列 但在大多数情况下我找不到关于它们的任何其他内
  • 验证是否存在唯一字符串的组合

    class Details String name String age String email String location 1 如果有详细信息列表 如下所示List
  • 计算排列中“反转”的数量

    设 A 为一个大小的数组N 我们称之为几个索引 i j 一个 逆 如果i lt j and A i gt A j 我需要找到一种接收大小数组的算法N 具有唯一的数字 并返回时间的倒数数O n log n 您可以使用归并排序 http en
  • JavaScript 中多个数组的笛卡尔积

    如何在 JavaScript 中实现多个数组的笛卡尔积 举个例子 cartesian 1 2 10 20 100 200 300 应该返回 1 10 100 1 10 200 1 10 300 2 10 100 2 10 200 2020
  • 哪种算法可以解决我的婚礼餐桌问题?

    我的婚礼有 x 位客人 有 y 张桌子 有 z 个座位 客人A可以与客人B同桌 客人C不能与客人D同桌 给定所有客人之间所有连接的数据集 是否有已知的算法可以解决此类问题 我确信这种问题有一个抽象的父问题 称为 问题 x 或其他问题 或者它
  • 如何使用 C 中的 Banker's Rounding 将 double 舍入为 int

    我想编写一个函数 使用银行家的舍入方法将双精度数舍入为整数 将一半舍入为偶数 http en wikipedia org wiki Rounding Round half to even http en wikipedia org wiki
  • Welzl 算法的迭代版本

    我正在使用 Welzl 算法来查找点云的最小外接圆 2d 或最小外接球体 3d 不幸的是 该算法具有非常高的递归深度 即输入点数 这个算法有迭代版本吗 我找不到任何并且不知道如何将递归更改为循环 我发现了一些迭代的最小包围圆 球算法 但它们
  • 如何规划庭院灯最有效的路线

    我正在尝试挂一些庭院灯 基于另一个问题 https cs stackexchange com questions 80134 christmas light route efficiency我问 我意识到我需要一种算法来解决路由检查问题 h
  • 如何决定权重?

    对于我的工作 我需要某种具有以下输入和输出的算法 输入 一组日期 过去的日期 输出 一组权重 每个给定日期一个权重 所有权重的总和 1 基本思想是 距离今天日期最近的日期应该获得最高的权重 第二个最接近的日期将获得第二高的权重 依此类推 有
  • 如何有效地从连续字符串中提取文字单词? [复制]

    这个问题在这里已经有答案了 可能的重复 如何将没有空格的文本拆分为单词列表 https stackoverflow com questions 8870261 how to split text without spaces into li

随机推荐