【问题标题】:what is the algorithm to optimally fill a dvd for burning最佳填充 DVD 进行刻录的算法是什么
【发布时间】:2012-07-25 16:21:35
【问题描述】:

在给定数百 GB 不同大小的资产的情况下,填充一组蓝光光盘的最佳算法是什么?

我正在尝试整合大量旧 CDROM、DVD 和小型硬盘驱动器,并将所有内容放入由 MD5 签名索引的数据库中。肯定是一项艰巨的任务。

我目前所做的是按降序对资产大小(通常是目录大小)进行排序,开始在填充列表中插入最大的资产,跳过任何不适合的资产,直到我用完资产。它几乎可以立即运行,但如果有必要,我不介意一夜之间运行。

它通常给我 95% 或更多的利用率,但我确信有一种方法可以使用其他组合来提供更高的效率。对于像磁盘映像这样的大型项目,我可以通过这种原始方法获得相当低的利用率。

我的想法是一次获取所有资产组合,1 然后 2,然后 3,... 项目,并保持最高字节数

这是最好的算法吗?

有 2 个 Perl 模块似乎可以胜任这项任务,Algorithm-Combinatorics 和 Math-Combinatorics。有什么更快、更稳定、更酷的建议吗?

我的方案是编写一个脚本来计算大量目录的大小,并显示要刻录的几十个磁盘的最佳内容。

而且,我不想只是逐个文件地填写,因为我希望整个目录都在同一张光盘上。

【问题讨论】:

    标签: algorithm disk


    【解决方案1】:

    这是一个 NP 完全问题,称为 bin packing。没有已知的多项式时间算法可以最佳地解决它。也就是说,基本上不尝试所有的方案,是无法找到最优方案的。

    从好的方面来说,一个非常简单的启发式方法,例如“将最大的剩余文件夹放在第一个有空间的磁盘上”,将保证您使用的磁盘数量少于最佳情况的两倍。 (您可以阅读有关该问题的 Wikipedia 文章的更多详细信息)。

    【讨论】:

      【解决方案2】:

      该算法称为一维装箱。该算法非常快但不是最优的。您也可以使用蛮力算法,但搜索空间非常大。这是一个贪心算法的程序:http://www.phpclasses.org/package/2027-PHP-Pack-files-without-exceeding-a-given-size-limit.html

      【讨论】:

        【解决方案3】:

        我发现的最实用的方法可以有效地填充我的蓝光光盘。

        我列出了所有要刻录的可用文件的完全限定路径。

        然后(任意)决定考虑多少个目录级别或接受一个命令行选项。这是为了在一张蓝光光盘上保持充满类似项目的目录。还有一个 STUFF 选项可以先插入最大的文件,当文件会导致溢出时,请查看下一个较小的文件,直到用完文件或空间。

        使用每个目录作为键和它包含的文件的总大小作为数据创建一个哈希。还要与每个目录的文件数保持并行散列,因为松弛空间和目录开销显然加起来并且必须考虑在内。

        选择 22 作为幻数。如果您有

        还接受输出目录并检查现有数据。有一个移动文件的选项(复制、检查大小和取消链接)。

        每次我买一个新的硬盘,它通常是以前的两倍大,所以我会把所有的东西都复制过来。使用尼康 D800E(Extreme!)、HDR 和全景,我终于用完了空间。

        我的项目是独特、剔除和整合价值 15 年的 [主要是垃圾] 照片、视频、电影、音乐等。我盘点了大约十几个存储设备,计算了 MD5 签名并将它们全部放入数据库中。我选择了一个驱动器作为图片的主驱动器,一个用于视频的驱动器,然后对其他所有内容进行了核对。我发现了一些东西的 8 个副本!

        我现在有大约 10 TB 的可用磁盘空间!!!

        如果有人感兴趣,该函数会执行所有实际工作。

        ================================================ 哎呀!无法提交您的答案,因为:

        Your post appears to contain code that is not properly formatted as code
        

        愚蠢的网页破坏了我的原始代码。对不起:(..

        【讨论】:

          【解决方案4】:

          使用“背包”优化问题中的算法。

          http://en.wikipedia.org/wiki/Knapsack_problem

          1. 将权重设置为等于文件大小
          2. 设置值等于“重量”
          3. 为要打包的每个后续磁盘运行算法

          它可能不是最佳选择(它将最大化下一个磁盘的填充因子,而不是最小化所需的总磁盘数量),但它有很好的文档记录,并且很容易找到适用于您在网络上的选择(甚至是电子表格)。

          【讨论】:

          • 没有。背包有 2 个变量。
          • 那又怎样?例如,您可以将所有元素的“值”设置为 1。
          • 当然可以。但它适用于字节和千字节的度量吗?这是虚拟的东西。
          • 我不太明白。在解决背包问题时,我们使用什么单位来表示“重量”有什么区别?
          • 如果重量和价值相等,那么背包只是减少到装箱。
          猜你喜欢
          • 1970-01-01
          • 2015-12-18
          • 2012-08-30
          • 2021-05-20
          • 1970-01-01
          • 2015-09-23
          • 1970-01-01
          • 1970-01-01
          • 2010-11-26
          相关资源
          最近更新 更多