|
|
1
43
这是NP难一些坏消息:这个问题是NP难的,所以除非P=NP,否则没有算法可以有效地解决它的所有实例。我将通过演示如何在多项式时间内转换NP难问题的任何给定实例来证明这一点 3SAT 以及如何将该问题的任何依赖性解决算法的输出转换为原始3SAT问题的解决方案,同样是在多项式时间内。逻辑基本上是,如果有某种算法可以在多项式时间内解决依赖性解决问题,那么它也可以在多项式内解决任何3SAT实例——由于计算机科学家花了几十年时间寻找这样的算法,但没有找到一个,这被认为是不可能的。 在下文中,我将假设任何时候最多可以安装一个版本的软件包。(这相当于假设同一包的每对不同版本之间存在隐式冲突。) 首先,让我们对依赖性解决问题制定一个稍微宽松的版本,假设没有安装任何包。我们需要的是一种算法,在给定“目标”包的情况下,要么返回一组要安装的包版本,(a)包括目标包的某个版本,(b)满足该组中每个包的所有依赖性和冲突属性,或者如果没有包版本集可以工作,则返回“IMPOSSIBLE”。显然,如果这个问题是NP难的,那么更一般的问题也是如此,在这个问题中,我们还指定了一组已安装的软件包版本,这些版本是不可更改的。 构造实例假设我们得到一个包含n个子句和k个变量的3SAT实例。我们将为每个变量创建两个包:一个对应于文字x_k,另一个对应文字!x_。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)、!q或r;接下来的3个版本正好满足2个;最后一个满足所有3。 最后,我们创建了一个“根”包,它将所有n个父子句包作为其依赖项。这将是我们要求包管理器安装的包。
如果我们在这组2k+8n+1包版本上运行包管理器,要求它安装根包,它将返回“IMPOSSIBLE”或要安装的包版本列表。在前一种情况下,3SAT问题无法令人满意。在后一种情况下,我们可以很容易地提取变量的值:如果安装了x_k的文字包,请将x_k设置为
甚至有些限制也很难这种构造不使用预先安装的软件包或“提供”信息,因此即使这些软件包不被允许,问题仍然是NP难题。更有趣的是,考虑到我们假设一次最多可以安装一个版本的任何软件包,问题仍然是NP难题 即使我们不允许冲突 :而不是使文字x_k和!x_k在每个方向上都有冲突子句的独立包,我们只是将它们作为同一个包的两个不同版本! |
|
serv-inc · web扩展的依赖关系管理 8 年前 |
|
ceremcem · 如何处理依赖关系源版本问题 8 年前 |
|
pevik Hudson · 使用自动工具获取所需的标题和库 8 年前 |
|
|
user293655 · 项目内的测试库 8 年前 |
|
|
jakub.g · 如何使Gradle项目VersionYe友好? 8 年前 |