依赖解析算法

2024-05-21

我正在编写一个包管理器,为此我希望依赖项解析尽可能强大。

每个包都有一个版本列表,每个版本包含以下信息:

  • 具有可比性的 ID
  • 依赖关系(软件包列表以及每个软件包的一组可接受的版本)
  • 冲突(软件包列表以及每个软件包的一组与该版本一起导致问题的版本)
  • Provides(软件包列表以及每个软件包还提供/包含的一组版本)

对于当前状态,我有一个软件包及其当前版本的列表。

我现在希望,根据可用包的列表和当前状态,能够获取包列表中每个包的版本,同时考虑给定的约束(依赖项、冲突的包、其他包提供的包)并且返回每个软件包的版本列表。循环依赖是可能的。

如果无法达到有效状态,则可以更改现有包的版本,但只有在必要时才应这样做。如果无法达到有效状态,则应提供尽可能多的原因信息(告诉用户“如果删除 X 就可以工作”等)。

如果可能的话,还应该可以将软件包“锁定”到特定版本,在这种情况下,软件包的版本可能不会更改。

我想要完成的事情与现有的包管理器已经做的非常相似,不同之处在于不一定需要使用包的最新版本(大多数包管理器似乎都是这样做的假设)。

到目前为止,我唯一的想法是为相关包的所有可能版本构建所有可能状态的结构,然后删除无效状态。我真的希望这不是唯一的解决方案,因为它感觉非常“暴力”。在几秒钟内获得约 500 个可用软件包(每个软件包约 100 个版本)以及约 150 个已安装软件包将是一个很好的目标(尽管越快越好)。

我不认为这是一个特定于语言的问题,但为了更好地说明它,这里有一些伪代码:

struct Version
    integer id
    list<Package, set<integer>> dependencies
    list<Package, set<integer>> conflicts
    list<Package, set<integer>> provides

struct Package
    string id
    list<Version> versions

struct State
    map<Package, Version> packages
    map<Package, boolean> isVersionLocked

State resolve(State initialState, list<Package> availablePackages, list<Package> newPackages)
{
    // do stuff here
}

(如果您应该有实际代码或了解执行此操作的现有实现(使用任何语言,首选 C++),请随意提及)


这是 NP 困难的

一些坏消息:这个问题是 NP 困难的,所以除非 P=NP,否则没有算法可以有效地解决它的所有实例。我将通过展示如何在多项式时间内转换 NP 困难问题的任何给定实例来证明这一点3SAT http://en.wikipedia.org/wiki/Boolean_satisfiability_problem#3-satisfiability转换为适合问题输入的依赖图结构,以及如何将该问题的任何依赖解析算法的输出转换回原始 3SAT 问题的解决方案,同样是在多项式时间内。逻辑基本上是,如果有某种算法可以在多项式时间内解决依赖解析问题,那么它也可以在多项式时间内解决任何 3SAT 实例 - 由于计算机科学家花了数十年的时间寻找这样的算法,但没有找到一个,据信这是不可能的。

下面我将假设任何时候最多可以安装任何软件包的一个版本。 (这相当于假设同一包的每对不同版本之间都存在隐式冲突。)

首先,让我们制定一个稍微宽松的依赖解析问题版本,其中我们假设尚未安装任何软件包。我们想要的是一种算法,给定一个“目标”包,要么返回一组要安装的包版本,(a) 包含目标包的某个版本,(b) 满足目标包中每个包的所有依赖性和冲突属性。设置,或者如果没有一组包版本可以工作,则返回“IMPOSSIBLE”。显然,如果这个问题是 NP 困难的,那么更普遍的问题也是 NP 困难的,其中我们还指定了一组不可更改的已安装的软件包版本。

构建实例

假设我们有一个包含 n 个子句和 k 个变量的 3SAT 实例。我们将为每个变量创建 2 个包:一个对应于文字 x_k,另一个对应于文字 !x_k。 x_k 包将与 !x_k 包发生冲突,反之亦然,确保包管理器最多安装这两个包之一。所有这些“字面”包都只有一个版本,并且没有依赖项。

对于每个子句,我们还将创建一个“父”包和 7 个版本的“子”包。每个父包都将依赖于其子包的 7 个版本中的任何一个。子包对应于从一组 3 个项目中选择至少一个项目的方法,并且每个子包都对相应的文字包有 3 个依赖项。例如,子句 (p, !q, r) 将具有依赖于文字包 (p, q, !r)、(!p, !q, !r)、(!p, q, r)、(p, !q, !r)、(p, q, r)、(!p, !q, r) 和 (p, !q, r):前 3 个版本完全满足以下条件之一文字 p、!q 或 r;接下来的 3 个版本恰好满足 2;最后一个满足所有 3 个。

最后,我们创建一个“根”包,它具有所有 n 个父子句包作为其依赖项。这将是我们要求包管理器安装的包。

如果我们在这组 2k + 8n + 1 个软件包版本上运行软件包管理器,要求它安装根软件包,它要么返回“IMPOSSIBLE”,要么返回要安装的软件包版本列表。在前一种情况下,3SAT问题是不可满足的。在后一种情况下,我们可以轻松提取变量的值:如果安装了 x_k 的文字包,请将 x_k 设置为true;如果安装了文字包 !x_k,则将 x_k 设置为false。 (请注意,安装两个文字包时不会有任何变量:每个变量至少出现在一个子句中,并且每个子句生成 7 个子包版本,必须安装其中至少一个,并且这将强制安装一个该变量的两个文字的值。)

甚至有些限制也很困难

这种构造不使用任何预安装的包或“提供”信息,因此即使不允许这些信息,问题仍然是 NP 困难的。更有趣的是,考虑到我们假设一次最多可以安装任何软件包的一个版本,问题仍然是 NP 困难的即使我们不允许冲突:我们不是将文字 x_k 和 !x_k 制作为在每个方向上都带有冲突子句的单独包,而是将它们制作为同一包的两个不同版本!

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

依赖解析算法 的相关文章

  • 找到不(必要)与二进制矩阵中的图像边界对齐的最大矩形

    我在用这个解决方案 https stackoverflow com questions 2478447 find largest rectangle containing only zeros in an nn binary matrix在
  • 所有可能的骑士在普罗梅拉的棋盘上移动

    是否有可能用马从初始位置 I J 绕过大小为 N N 的棋盘 并且只访问每个方格一次 define A True A I J false active proctype method bit I 4 bit J 3 bit K 1 bit
  • 对矩阵进行舍入,保留行和列总计

    想要 以保留行和列总计的方式对矩阵进行舍入的 伪 代码 问题从向量开始 X and Y of 非负整数 with Sum X Sum Y 想要圆X Y Sum X 同时保留行和列总计 这是婚姻问题的一种 Xa需要进行一定次数的握手 拨打该号
  • 直观地执行不同的排序算法[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Python 中的空填字游戏求解器

    我得到了一个包含填字游戏蓝图的矩阵 当然 它是空的 我们的目标是填补整个难题 这是 Checkio 的一项任务 我已经为此奋斗了相当长一段时间 根据我对复杂性的理解 这个问题没有完美的算法 不过 必须有最好的方法来做到这一点 对吧 我尝试了
  • 用于计算三角函数、对数或类似函数的算法。仅限加减法

    我正在修复 Ascota 170 古董机械可编程计算机 它已经开始工作了 现在我正在寻找一种算法来展示其功能 例如计算三角或对数表 或类似的东西 不幸的是 从数学运算来看 计算机只能进行整数的加减法 从 1E12到1E12的55个寄存器 甚
  • 计算具有 3 个循环的算法的复杂度

    我尝试解决以下练习 以下代码片段最坏情况运行时间的增长顺序是什么 作为 N 的函数 int sum 0 for int i 1 i lt N i for int j 1 j lt i i j for int k 1 k lt j j k s
  • 使用 Numba 加速矢量距离计算

    以下是我为 3 D 环形几何中的距离 平方 计算编写的一些函数 用于该 3 D 空间中的粒子集合 import itertools import time import numpy as np import scipy import num
  • 查找文本中所有关键字的有效算法

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

    好吧 这是一个有点复杂的问题 但是 tl dr 基本上是如何使用 模式树 解析 实际树 如何检查特定的树实例是否与特定的模式树匹配 首先 我们有我们的结构模式树 模式树通常可以包含以下类型的节点 sequence节点 匹配一系列项目 零个或
  • 线段树java实现[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 你知道 二进制 的良好实现吗线段树 http en wikipedia org wiki Segmen
  • Python Pandas:沿一列比较两个数据帧,并返回另一个数据帧中两个数据帧的行内容

    我正在处理两个 csv 文件并作为数据框 df1 和 df2 导入 df1 有 50000 行 df2 有 150000 行 我想将 df2 的 时间 与 df1 求时间差并返回所有列的值 对应相似的行 保存在df3中 时间同步 例如 35
  • 如何将多边形放入另一个多边形内[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有两个多边形 如下图所示 左边是 粗多边形 右边是 最终多边形 现在 我正在寻找算法来将 最终多边形 拟合到 粗糙多边形 内 并具有
  • “包含字符串”的快速索引

    在我的应用程序中 我有多达数百万个短字符串 大部分短于 32 个字符 我想实现一个带有附加列表的搜索框 该列表仅包含包含在搜索框中输入的整个字符串的元素 如何预先建立索引来快速找到此类字符串 所有排序的 STL 容器都会检查整个字符串 对于
  • 什么是“朴素”算法,什么是“封闭式”解决方案?

    我有一些关于描述算法时使用的术语语义的问题 首先 朴素 算法是什么意思 这与给定问题的其他解决方案有何不同 解决方案还可以采取哪些其他形式 其次 我听到很多人提到 封闭式 解决方案 我也不知道这意味着什么 但在尝试解决递归关系时经常会出现
  • 为什么这个算法的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
  • 如何计算 3D Morton 数(交织 3 个整数的位)

    我正在寻找一种快速计算 3D Morton 数的方法 这个网站 http www graphics stanford edu seander bithacks html InterleaveBMN有一个基于幻数的技巧来处理 2D Morto
  • String.contains() 的时间复杂度

    String contains 的时间复杂度是多少 假设 n 是与另一个长度为 k 的字符串进行比较的字符串的长度 如果不知道您感兴趣的 String contains 的实际实现 就没有答案 或者你打算使用什么算法 一个完全幼稚的实现可能
  • 调度算法,找到设定长度的所有非重叠区间

    我需要为我的管理应用程序实现一种算法 该算法将告诉我何时可以将任务分配给哪个用户 我实现了一个蛮力解决方案 它似乎有效 但我想知道是否有更有效的方法来做到这一点 为了简单起见 我重写了算法以对数字列表进行操作 而不是数据库查询等 下面我将尝
  • 我如何开始玩五子棋?

    我读到Gomoku http en wikipedia org wiki Gomoku它可以使用 Minimax 和 Alpha Beta 剪枝算法来实现 所以 我阅读了这些算法 现在了解了游戏将如何解决 但是当我坐下来编写代码时 我面临着

随机推荐

  • 如何在python中使用RSA私钥加密数据?

    我已经安装了pyCrypto http pythonhosted org pycrypto 在 Python 2 7 1 上打包来执行一些加密操作 Q1 我想做的操作是加密一些数据private Key 代替public Key 这个图书馆
  • 在 clojure 中,使用递归实现宏时如何进行代码模板化

    我正在尝试实现一个宏 以递归地将中缀列表转换为前缀列表 我遇到一个问题如下 this works defmacro recursive infix form list second form first form if not seq nt
  • SQLite SQL 查询出现问题[重复]

    这个问题在这里已经有答案了 我正在尝试在 SQLite 3 中运行以下查询 SELECT DISTANCE latitude longitude AS distance FROM country WHERE id NOT LIKE HAVI
  • 如何在 2 个项目之间移动 Google Cloud DNS 条目?

    我想做一些非常简单的事情 但看起来几乎不可能做到 我的 Google Cloud DNS 帐户中有不同的项目 我想将一些条目 域 从一个项目移动 迁移 到另一个项目 我不想走删除 重新创建路径 因为所有域都是活动的 并且我不希望有任何停机时
  • 防止在派生类中调用基类实现的接口方法 C#

    是否可以在基类中实现接口并允许在第一个派生类级别调用 覆盖已实现的方法 但阻止从任何进一步的派生类调用它 public interface IInterfaceSample bool Test public class Base IInte
  • 如何在Django中显示内存中的图片?

    我知道如何将图片显示为内存中的页面 如下所示 import cStringIO mStream cStringIO StringIO picBin return HttpResponse mStream getvalue image jpg
  • Chrome 问题:“无法加载资源:net::ERR_CONNECTION_TIMED_OUT”

    我尝试通过 HTTPS 访问我的 Web 应用程序 它无法加载 JavaScript 文件并显示 无法加载资源 net ERR CONNECTION TIMED OUT 但它在 IE 和 Firefox 中按预期工作 通过 HTTP 在 C
  • 就SQL注入而言,哪种sql查询更安全

    我有两个 SQL 查询正在尝试更新sup and opp每次调用查询时 值分别为 1 和 1 第一个查询 query update disc set sup sup opp opp where did did int sup getnoof
  • SVG img keepAspectRatio Chrome

    当我对 SVG 文件中的图像使用preserveAspectRatio none 时 它 似乎在 Google Chrome 中不起作用 SVG 不会根据图像宽度和高度进行缩放
  • 右下角对齐的更好方法

    有没有更好的方法来对齐单元格右下角的某些内容 我有一个 div 只包含一个背景图像 10px x 10px 我使用以下样式将其放在右下角 我所在的单元格高 40 像素 这样做会导致我失去 div 上方的 30px 我还使用它作为单击的对象
  • SQL Server - 选择满足条件的第一行

    我有 2 个包含 ID 的表 其中一个表中会有重复的 ID 我只想为表 B 中的每个匹配 ID 返回一行 例如 Table A objectIdA objectIdB 1 A 1 B 1 D 5 F Table B objectIdA 1
  • MSysGit 与 Windows 版 Git

    我无法确定MSysGit 和 Windows 版 Git 之间的区别 http msysgit github com 它们有何不同 为什么我会选择其中之一而不是另一个 它们不是同一个东西吗 On http msysgit github co
  • 如何解析cURL返回的header?

    我正在尝试使用 cURL 与 API 进行通信 其中一种方法要求我传递ININ ICWS CSRF Token标题 即WAhtYWxoYXlla1dBY2NvUkRJWCQxZmUxZWFhZS0xZTE0LTQyNGYtYjdhZS0zN
  • Ios Swift制作字体切换粗体、斜体、boldItalic、正常而不改变其他属性

    我很惊讶 在 Swift 中简单地为现有字体设置粗体和斜体是如此复杂 我只是想通过在字体类上使用以下方法来简化事情 我希望将以下方法添加到已设置字体系列和字体大小的现有字体中 我需要保留这些并仅更改以下内容 setBold Shud 保留斜
  • 如何强制 pm2 在特定时间后重新启动?

    我在用PM2让我的 Node js 应用程序保持运行 有什么办法可以拥有PM2每 1 小时重新启动一次我的应用程序 将下面的代码放入pm2 js并开始它pm2 start pm2 js var pm2 require pm2 pm2 con
  • 共享辅助轴

    如何使用 matplotlib 中的子图设置共享辅助轴 这是显示问题的最少代码 import numpy as np import matplotlib as mpl import matplotlib pyplot as plt def
  • 如何将包含大量表格的 HTML 文档转换为 Word 文档?

    我创建了一个包含许多表格的 HTML 文档 如何将文档转换为Word 问题是 如果我用 Word 打开 HTML 文档 由于某种原因我会得到非标准的双行表格 table border 1 color 000000 cellpadding 0
  • 由于缺少 PHP 扩展,CakePHP 3 无法连接到数据库

    我正在尝试使用 WT NMP 安装 cakePHP 3 0 0 但收到以下消息 CakePHP 无法连接到数据库 由于以下原因无法使用数据库驱动程序 Cake Database Driver Mysql 缺少 PHP 扩展或未满足的依赖项
  • 如何让 Vim 突出显示非 ascii 字符?

    我试图让 Vim 突出显示非 ASCII 字符 是否有可用的设置 正则表达式搜索模式或插件来执行此操作 在 a 中使用范围 搜索中的字符类 您应该能够excludeASCII 十六进制字符范围 因此突出显示 假设您有hlsearch启用 所
  • 依赖解析算法

    我正在编写一个包管理器 为此我希望依赖项解析尽可能强大 每个包都有一个版本列表 每个版本包含以下信息 具有可比性的 ID 依赖关系 软件包列表以及每个软件包的一组可接受的版本 冲突 软件包列表以及每个软件包的一组与该版本一起导致问题的版本