Распределение камней по ведрам (нетривиально) / Упаковка целочисленных бинов Верхняя граница

Предположим, у вас есть k камней и m типов камней. У вас есть камни f1 первого типа, f2 второго и так далее.

(т.е. сумма (f_i) = k).

Кроме того, нам дано натуральное число r.

Какое минимальное количество ведер потребуется, чтобы мы могли распределить типы камней по ведрам, размер каждого из которых не превышает r? (Мы также знаем, что для каждого i f_i ‹= r).

Этот вопрос на самом деле является чем-то вроде упаковки в мусорное ведро, поэтому я не уверен, что на него есть точный ответ, но можем ли мы дать ему верхнюю границу?

Примером тривиальной верхней границы является m, так как это позволит нам упаковать каждый тип камня в его собственное ведро.

Примером границы, которая не работает, является k/r. Причина в том, что если k=9, r=3 и у нас есть 5 типов камней, f1 = 2, f2 = 2, f3 = 2, f4 = 2, f5=1,

Тогда независимо от того, как мы разделяем типы камней, должно быть ведро размером >= 4.

Все камни одного типа должны быть отправлены в одно ведро.

Какие-либо предложения :) ?

РЕДАКТИРОВАТЬ: m и f_i неизвестны, и я ищу границу, которая позволяет мне распределять камни для всех комбинаций (m, f_i).

Другой пример: предположим, что r = 3. Я докажу, что достаточно k/2 ведер:

Обозначим через x количество видов, для которых имеется 3 камня. y будет обозначать количество типов, из которых есть ровно 2 камня, а z будет обозначать количество типов с одним камнем.

По определению: 3x + 2y + z = k. Мы можем выделить x ведер для типов с 3 камнями.

Если (y > z) {первый случай}: Сопоставьте один из типов y вместе с одним из типов z в ведре {у нас есть z таких ведер}.

Установите остальные типы y по одному в ведро.

Поскольку y > z, мы использовали ровно x+y ведер, а поскольку 3x + 2y + z = k => x+y ‹= k/2.

Если (z >= y) {второй случай}: легко видеть, что мы можем поместить все камни в k/3 ведер (каждое ведро может быть полным, содержащим ровно 3 камня).

Кроме того, для r=3 это жестко ограничивает его (если x=z=0 и y=k/2, то нам нужно ровно k/2 ведер).

Теперь возникает вопрос: выполняется ли ограничение k/2 сегментов для всех значений r?

Я могу показать, что нижняя граница (т. е. плотный пример) 2k/(r+1) сегментов, но она довольно далека от k/2. Кто-нибудь может подтянуть связку?


person user3095429    schedule 29.12.2013    source источник
comment
Должны ли камни одного типа помещаться в одно и то же ведро?   -  person Andrey Mishchenko    schedule 29.12.2013
comment
Или наоборот однотипные камни не могут попасть в одно ведро?   -  person Suor    schedule 29.12.2013
comment
Я должен сказать, что довольно раздражает, что такой очевидный вопрос не был решен заранее, когда ясно, что ОП принимает либо мое ограничение, либо ваше (@Suor), либо какое-то сумасшедшее ограничение.   -  person Andrey Mishchenko    schedule 29.12.2013
comment
Если камни одного и того же типа должны быть в одном ведре, я не вижу, чем это отличается от проблемы с упаковкой в ​​корзину...   -  person Ron Teller    schedule 29.12.2013
comment
@Андрей, извините, если вопрос не так написан. Если у вас есть более информативное название, пожалуйста, отредактируйте/напишите его здесь, и я отредактирую. Спасибо !   -  person user3095429    schedule 29.12.2013
comment
@RonTeller,@Andrey- все камни одного типа должны идти в одно ведро. Это Bin Packing с целочисленными размерами, но, как я уже упоминал, я ищу не точный ответ, а верхнюю границу. В моей задаче m неизвестно, и все, что я знаю, это то, что количество камней каждого типа не больше r, а общее количество камней равно k. Поэтому лучшая оценка, которую я имею на данный момент, это k (которая является верхней границей m). Я предполагаю, что k/2 также имеет место, но я затрудняюсь доказать/опровергнуть это. k — правильная верхняя граница, k/r — нет (см. мой пример во вступительном посте).   -  person user3095429    schedule 29.12.2013
comment
m неизвестно — еще одно довольно существенное ограничение.   -  person Bernhard Barker    schedule 29.12.2013
comment
Если вы не решаете экземпляры этой проблемы, а пытаетесь определить ее фундаментальное и общее свойство, разве это не должно быть на cstheory.stackexchange. ком ?   -  person harold    schedule 29.12.2013
comment
@harold Я сомневаюсь, что это действительно вопрос исследовательского уровня, поэтому теоретическая информатика, вероятно, не совсем уместна, но Информатика может быть.   -  person Bernhard Barker    schedule 30.12.2013


Ответы (1)


Вы можете использовать алгоритм первого подбора для задачи упаковки контейнера практически без изменений. необходимый:

  1. Создайте список L, содержащий m целых чисел, каждое из которых представляет количество камней каждого типа.
  2. Отсортируйте список в порядке убывания.
  3. Создать новое ведро
  4. Пройти L от начала до конца, если добавление текущего элемента L в корзину не превышает r, добавить в корзину и удалить из L.
  5. Если L пусто, вернуть количество сегментов. В противном случае вернитесь к шагу 3.

Этот алгоритм является аппроксимацией 11/9*OPT + 6/9, что вполне прилично и в большинстве случаев дает очень хороший результат.

Текущий тип этого алгоритма — O(m log m). Если m не задано, для создания списка необходимо подсчитать количество камней каждого типа, что занимает O(L) времени, а вся процедура займет O((m log m) + L) времени.

person Ron Teller    schedule 29.12.2013
comment
ОП поясняет, но я подозреваю, что вам просто даны k и r, а не все настоящие камни (другое m неизвестно - бессмысленное ограничение). - person Bernhard Barker; 29.12.2013
comment
Спасибо @Ron, но я боюсь, что мог ввести вас в заблуждение в исходном вопросе :(. m, и f_i неизвестны, и я ищу границу, которая работает для всех комбинаций m/f_i. Если вы посмотрите на (отредактированный :/) вопрос, я привожу пример, который показывает, что если r = 3, то k/2 ведер достаточно для упаковки камней Я также могу показать, что 2k/(r+1) являются минимальным требованием для этого , но у меня все еще есть огромный разрыв, который я пытаюсь сократить. - person user3095429; 29.12.2013