Вопрос
Я хочу написать небольшую утилиту помощника для организации мою оцифрованную коллекцию аудиокниги.
У меня есть набор папок, которые мне нужно, чтобы написать на CD. Папки не могут быть разделены: каждая папка идет на один диск.
Я хочу заполнить диски наиболее эффективно:
- Минимизировать количество дисков и
- Количество равных дисков, максимизирующее хранилище доступное наименее заполненного диска (
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», сделает это работать?