对于任何Linux Distro的打包系统,请查找可同时安装的程序包的最大数量

时间:2016-04-01 13:51:01

标签: debian package-managers dpkg

某些软件包冲突,因此无法一次安装所有可用软件包。给定系统的可安装包的最大可能数量是多少?蛮力的试错方法是:

  1. 列出每个可能的包名称​​即 getData()
  2. 从中,制作每个可能包combination的子列表dglob -a > list。在我的系统slist1 slist2 slist3 ...上返回 91327 ,这需要unfeasibly large number 1.467×10 ^ 27492 files
  3. 在每个列表上运行dglob -a | wc -l,并apt-get install生成冲突的内容。
  4. 按行数对剩余列表进行排序,并显示最长的列表。 rm
  5. 容易,但资源太重,所以也许有一些更可行的方法。

    随后出现各种相关问题,例如:

    • 给定一个包'foo',如何找到与'foo'不冲突的最大可安装包数?

    • 对于所有可能的包,它具有最小的最大值,(使其成为最“争吵”的包)?

    注意:这个问题适用于Debian,Red Hat以及任何带有打包程序冲突的打包系统的发行版或操作系统。任何适用平台的答案都是有效的。

    背景:

    Debian 拥有数以万计的软件包。 wc -l slist* | head -n -1 | sort -g | tail -1(来自 debian-goodies 包)可以方便快速计算:

    dglob

    示例输出(两个数字在更新和升级后可能会定期波动,并且会因系统而异):

    # show how many packages installed and available on the current system
    echo $(dglob    | wc -l) packages installed of \
         $(dglob -a | wc -l) packages.
    

    数字 5107 当然不是最大值,但必须有最大值。

2 个答案:

答案 0 :(得分:1)

在这种情况下,蛮力选项是唯一的选择。此处 a paper 将深入描述原因,但问题是包安装和依赖项/冲突解决是 NP-Complete 问题。

如果每个 TRUE 答案都有一个易于检查的多项式大小的解释,那么问题就是 NP。在这种情况下,这可以通过列出已安装的软件包和可用的软件包来完成。

如果问题的有效解决方案可以适用于 NP 中所有其他问题的有效解决方案,则 Debian 软件包安装是 NP 难的。我将遵循上面列出的论文,因为在这里证明有点复杂,但它可以编码为 3-SAT

由于 Debian 软件包安装在 NP 和 NP-hard 中,因此它是 NP-complete。

以下是 APT 中的 default 求解器试图避免 NP 完备性的一些方法:

  • 启发式方法的使用
  • 优先选择 or-group 中的第一个元素
  • 严格的包版本约定
  • 遇到重大冲突时放弃。

基本上,约束必须专门设计为使问题落入已知的易处理类,以解决像 HORN-SAT 这样的 NP-Complete 问题

不幸的是,find the maximum possible number of installable packages for a given system 几乎排除了我所知道的所有已知的易处理类。

所以蛮力是唯一的选择,而且在发现合适的易处理类或有人证明 P=NP 之前,这是一种昂贵的选择。

答案 1 :(得分:-2)

apt list > tmp.file vi tmp.file 然后在vi中按G键。这将为您提供可用的软件包数量,但不幸的是它不能解决冲突。