Добрый день и с праздником!
Задачка родилась из практики, но для "Алгоритмов", наверное, не очень подходит.
В Windows есть такая штука, как ImageList (IL) — хранилище для картинок одинакового размера в виде одного большого (длинного) изображения. Одна из "замечательных" особенностей IL — если к нему добавить новую картинку, то (внутри) происходит следующее:
— создаётся копия внутреннего изображения с дополнительным "местом" для новой картинки,
— в это дополнительное место вставляется добавляемое изображение,
— старое изображение удаляется.
IL способен также добавлять изображения из другого IL. Алгорит его действий такой-же, только место выделяется сразу для всех добавляемых картинок.
Если в IL последовательно добавлять картиноки, то общее время работы растет (приблизительно) в арифметической прогрессии.
Попробуем уменьшить трудозатраты добавления картинок. Будем считать, что трудозатраты добавления к списку из N1 картинок другого списка из N2 картинок — пропорциональны N1 + N2. Сами картинки пусть загружаются извне, и затраты на их загрузку учитывать не будем (как общие для всех возможных алгоритмов).
Для начала, примем что составление списка из двух картинок требует 2 единицы времени:
(1) (1) |трудозатраты
\ / |
2 | = 2
Тогда, при последовательной загрузке 4-х изображений "тупым" способом, потребуется 9 единиц времени:
(1) (1) |трудозатраты
\ / |
2 (1) | = 2
\ / |
3 (1) | = 2 + 3
\ / |
4 | = 2 + 3 + 4 = 9
Если мы предварительно разобъем на две группы по две картинки, то получим:
(1)(1) (1)(1) |трудозатраты
\ / \ / |
2 2 | = 4
\ / |
\ / |
4 | = 4 + 4 = 8
А теперь вопросы (уже, наверное, понятно какие
)
— Составить оптимальный алгоритмы загрузки для произвольного N
— оценить трудозатраты для этого оптимального алгоритма.
Евгений