我想写一个小帮手实用程序来组织我的数字化有声读物集。
我有一组文件夹需要写入CD。无法拆分文件夹:每个文件夹都会转到一个磁盘上。
我想最有效地填充磁盘:
80 + 20
剩余空间优于50 + 50
)。我应该使用哪种算法?
答案 0 :(得分:4)
这被称为Bin Packing Problem并且是NP难的,所以没有一个简单的算法来解决它。
我发现效果最好的解决方案(我用一个几乎与此相同的问题进行编程竞赛),是按大小排序文件夹并将最大的文件夹放在光盘上,直到它已满或所有剩余的文件夹太大而不适合剩下的空间。
这很快解决了问题,因为在排序之后算法的其余部分是O(n)。
在我参加的比赛中,这导致了74张光盘而不是79张光盘,这是我们最大的测试数据集的天真解决方案。
答案 1 :(得分:2)
如果您想在一张CD-R 光盘上打包文件/文件夹,那么您可以在伪多项式时间内以最佳方式执行此操作。为此,您必须将文件/文件夹的大小舍入为扇区,并计算CD-R上可用的扇区。
在此之后,我们得到 discrete 1-D knapsack packing problem ,这可以使用动态编程很好地解决,复杂度为 O(n),
更具体一点:
为了获得更好的性能,您可以始终过度估计扇区的大小,例如设置:
更重要的是:
也许以贪婪的方式应用这个算法“打包一张CD,打包下一张CD”会做到吗?