2009-07-15 4 views
1

Каков наилучший способ группировки x количества элементов в y количество групп на основе свойства переменной для каждого элемента, например. вес.Группировка элементов в сбалансированные группы

Оставляя меня с y количеством групп, каждый из которых владеет одной и той же суммой (цена) (или близкой к той же). Таким образом, группы уравновешиваются совокупным весом.

+0

Не используйте массивы, используйте, например, SortedMap <Свойство, список >. – starblue

ответ

2

Используйте java.util.Arrays.sort(Object[] a, Comparator c) с реализацией Comparator, которая сортируется в соответствии с вашими требованиями.

0

Назовем ваши «y суммы» бункеров. Вы заявляете, что хотите распределить свои предметы в сбалансированном состоянии между всеми ящиками.

Одна структура, имеющая аналогичное свойство, представляет собой сбалансированные деревья. Тогда я бы сделал следующее. Во-первых, заполнить сбалансированное дерево, используя выбранное свойство в качестве ключа. Затем опуститесь на желаемый уровень дерева, так что на этом уровне есть N элементов, N - количество требуемых бункеров. Поместите весь элемент потомка из каждого из этих узлов в отдельный ящик.

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

3

Я бы, вероятно, сделал это с Map от Set s с индексацией собственности. Что-то вроде:

Map<K, Set<V>> results = new HashMap<K, Set<V>>(); 
for (V item : items) { 
    K key = item.getProperty(); 
    Set<V> group = results.get(key); 
    if (group == null) { 
     group = new HashSet<V>(); 
     results.put(key, group); 
    } 
    group.add(item); 
} 

Где V - тип ваших товаров, а K - тип имущества.

+0

ОК, этот ответ больше не уместен, так как вы полностью переформулировали вопрос :-) – Olivier

1

Это Partition problem обобщается y групп вместо 2. Проблема для y=2 слабо NP-трудной, поэтому существует псевдополином алгоритм, который решает эту проблему эффективно, пока веса небольшие целые числа.

+0

Где я могу найти пример этого алгоритма, желательно java. – Dupdroid

Смежные вопросы