4

デジタル化されたオーディオブックコレクションを整理するための小さなヘルパーユーティリティを作成したいと思います。

CDに書き込む必要のあるフォルダのセットがあります。フォルダを分割することはできません。各フォルダは1つのディスクになります。

ディスクを最も効率的に埋めたい:

  1. ディスクの数を最小限に抑え、
  2. ディスクの数が等しい場合は、最も少ないディスクで使用可能なストレージを最大化します(80 + 20残りのスペースはよりも優れています50 + 50)。

どのアルゴリズムを使用する必要がありますか?

4

2 に答える 2

4

これはビンパッキング問題と呼ばれ、NP困難であるため、これを解決するための単純なアルゴリズムはありません。

私が見つけた解決策は(これとほぼ同じ質問でプログラミングコンテストを実行しました)、フォルダーをサイズ順に並べ、ディスクがいっぱいになるか、残りのすべてのフォルダーが大きくなりすぎるまで、ディスクに収まる最大のフォルダーを配置することでした。残りのスペースに収まるように。

ソート後の残りのアルゴリズムはO(n)であるため、これにより問題が迅速に解決されます。

私が実行したコンテストでは、これにより、最大のテストデータセットで単純なソリューションが達成する79枚ではなく74枚のディスクが作成されました。

于 2010-11-12T16:11:56.167 に答える
2

ファイル/フォルダを1枚のCD-Rディスクにパックしたい場合は、疑似多項式時間でこれを最適に行うことができます。これを行うには、ファイル/フォルダーのサイズをセクターに丸め、CD-Rで使用可能なセクターをカウントする必要があります。

この後、離散1次元ナップザックパッキング問題が発生します。これは、複雑さ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の場合の分数

そのうえ:

  • ソリューションはうまく並列化できます。

たぶん、このアルゴリズムを貪欲な方法で適用すると、「1枚のCDをパックし、次のCDをパックする」でうまくいくでしょうか。

于 2011-08-24T11:35:51.450 に答える