LINUX.ORG.RU

Распределить на равные группы

 


2

1

Есть Set<List<String>> listSet. Листы в сете могут быть произвольной длинны. Нужно распределить листы на две группы, чтобы получилось почти одинаковое кол-во по list.size() в левой и правой группе.

Ткните носом в формулу, плз


В общем случае, это дело пахнет NP-полнотой (в данной постановке нет, но не хочу сейчас так глубоко копать).

Делай какую-нибудь тупую эвристику. Навскидку, бери списки по одному и добавляй их в ту группу, где сейчас меньше всего элементов. Для лучшего результата списки можно брать в порядке убывания количества элементов.

Waterlaz ★★★★★
()
Последнее исправление: Waterlaz (всего исправлений: 1)

Тебе надо быстро или точно, но с большим использованием памяти?

Если быстро, то просто жадный алгоритм.

Если точно, то динамическое программирование как в задаче «Двумерное динамическое программирование» вот тут https://habrahabr.ru/post/113108/. Представляешь выбор куда положить список как выбор шага вниз или вправо. Путь - это комбинация поворотов вправо или вниз, значит эквивалентно разбиению на два множества. Сложность и потребление памяти - O(n^2) от количества списков в множестве

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 1)

В своё время, я сделал примерно как и написал выше Waterlaz.
Отсортировал, а затем по кучкам делил.
У меня правда ситуёвина, возможно, проще была.
Мне не нужно было чтобы оно тютелька в тютельку было, и я тупо кидал в 1-4 кучу по очереди.

anonymous
()
Ответ на: комментарий от vertexua

Благо дарю те вертуха, за ссылку :)

anonymous
()
Ответ на: комментарий от vertexua

О, спасибо за ссылку! Память меня вообще не тревожит, там небольшое кол-во данных

by_zero
() автор топика
Ответ на: комментарий от vertexua

Добавлю, что в данном случае константу можно уменьшить, т.к. матрица будет симметрична относительно главной диагонали.

mythCreator
()
Ответ на: комментарий от vertexua

Если точно, то динамическое программирование

А точно динамическое программирование зайдет? Оно не для всех случаев подходит.

pathfinder ★★★★
()

Вернусь домой с работы, попробую написать свой вариант решения.

pathfinder ★★★★
()
Последнее исправление: pathfinder (всего исправлений: 1)
Ответ на: комментарий от vertexua

Ещё раз перечитал про динамическое программирование, думаю, я был не прав.

pathfinder ★★★★
()
Последнее исправление: pathfinder (всего исправлений: 1)
Ответ на: комментарий от anonymous

Она NP-полная, но с оговорками. Время все же полиномиально зависит от суммарного количества элементов в списках.

Waterlaz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.