包装问题

时间:2010-11-12 15:50:21

标签: algorithm packing

我想写一个小帮手实用程序来组织我的数字化有声读物集。

我有一组文件夹需要写入CD。无法拆分文件夹:每个文件夹都会转到一个磁盘上。

我想最有效地填充磁盘:

  1. 最小化磁盘数量,
  2. 磁盘数量相等,最大化最少填充磁盘的可用存储空间(80 + 20剩余空间优于50 + 50)。
  3. 我应该使用哪种算法?

2 个答案:

答案 0 :(得分:4)

这被称为Bin Packing Problem并且是NP难的,所以没有一个简单的算法来解决它。

我发现效果最好的解决方案(我用一个几乎与此相同的问题进行编程竞赛),是按大小排序文件夹并将最大的文件夹放在光盘上,直到它已满或所有剩余的文件夹太大而不适合剩下的空间。

这很快解决了问题,因为在排序之后算法的其余部分是O(n)。

在我参加的比赛中,这导致了74张光盘而不是79张光盘,这是我们最大的测试数据集的天真解决方案。

答案 1 :(得分:2)

如果您想在一张CD-R 光盘上打包文件/文件夹,那么您可以在伪多项式时间内以最佳方式执行此操作。为此,您必须将文件/文件夹的大小舍入为扇区,并计算CD-R上可用的扇区。

在此之后,我们得到 discrete 1-D knapsack packing problem ,这可以使用动态编程很好地解决,复杂度为 O(n)

更具体一点:

  • O(n) = O(nW),因为 W 在您的情况下是常数 - W是CD上的扇区数量R上。
  • n 文件/文件夹数量。

为了获得更好的性能,您可以始终过度估计扇区的大小,例如设置:

  • 过于接近的扇区大小70k
  • 是什么让CD-R上700M / 70k = 10k的所有扇区
  • 当金额文件小于(1G / 10k = 100k)100k - n < 100'000
  • 以分钟为单位 n < 10'000'000

更重要的是:

  • 解决方案可以很好地并行。

也许以贪婪的方式应用这个算法“打包一张CD,打包下一张CD”会做到吗?