Вопрос

Я хочу написать небольшую утилиту помощника для организации мою оцифрованную коллекцию аудиокниги.

У меня есть набор папок, которые мне нужно, чтобы написать на CD. Папки не могут быть разделены: каждая папка идет на один диск.

Я хочу заполнить диски наиболее эффективно:

  1. Минимизировать количество дисков и
  2. Количество равных дисков, максимизирующее хранилище доступное наименее заполненного диска (80 + 20 Оставшееся пространство лучше, чем 50 + 50).

Какой алгоритм я должен использовать?

Это было полезно?

Решение

Это называется Проблема уплотнения бен И это NP-Hard, поэтому нет простого алгоритма для его решения.

Решение, которое я нашел, работал лучше всего (я провел конкурс программирования с вопросом почти одинаковым для этого), должен был заказать папки по размеру и поместить самую большую папку, которая все еще подходит к диску, пока он не будет полностью или все остальные папки слишком велики вписаться в оставшееся пространство.

Это решает проблему быстро, поскольку после рода остальная часть алгоритма o (n).

В конкурсе я работал, это привело к 74 дискам вместо 79, что наивный раствор достигнет для наших крупнейших наборов тестовых данных.

Другие советы

Если вы хотите упаковать файлы / папки на один CD-R диск, чем вы могли бы сделать это оптимально в псевдополиноминном времени. Для этого вам приходится круглые размеры файлов / папок в секторах и подсчитывать секторы, доступные на CD-R.

После этого мы получаем Отдельный 1-D KNAPSACK Упаковочная проблема, что может быть решено хорошо, используя динамическое программирование, со сложностью На),

Быть более конкретным:

  • На) = O (NW) , причина Варенье постоянен в вашем случае - W - это количество секторов на CD-R.
  • N. количество файлов / папок.

Для лучшей производительности вы всегда можете переоценить размер секторов, пример настройки:

  • Переосвязанный размер сектора 70k
  • Что составляет 700 м / 70к = 10к всех секторов на CD-R
  • который должен вычислять в секундах, когда количество файлов меньше, чем (1g / 10k = 100k) 100k - N. < 100'000
  • в минутах, когда N. < 10'000'000

Что еще больше:

  • Решение может быть красиво параллельно.

Может быть, применяя этот алгоритм в жадном порядке «Pack One CD, упаковать следующий CD», сделает это работать?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top