Структура данных для «сопоставления» коллекций с состояниями в алгоритме динамического программирования

#java #algorithm #data-structures #dynamic-programming

#java #алгоритм #структуры данных #динамическое программирование

Вопрос:

Я кодирую для развлечения алгоритм для определения наилучшего порядка построения N строительных объектов. Конечно, каждое здание имеет свои собственные характеристики (такие как стоимость, производство, время строительства, …). Также существует общий порядок построения объектов на основе этих характеристик.

В какой-то момент моего динамического программирования мне нужна адаптированная структура данных, чтобы получить наилучший результат, достигнутый на данный момент, для построения здания k (k <= N). Мне нужна эта структура данных, чтобы каким-то образом «сопоставить» коллекцию здания k (возможно, отсортированную, поскольку построение здания b1, а затем b2 или b2, а затем b1 оставляет меня с теми же N-k зданиями, но, скорее всего, может привести к разным состояниям) с достижением «наилучшего состояния» на данный момент.

Вероятно, я мог бы использовать простой HashMap, но это подразумевает повторение огромного количества коллекций, содержащих одни и те же элементы, не принимая во внимание, что [b1, b2] является вложенной коллекцией [b1, b2, b3, b4], например.

Я надеюсь, что я достаточно ясно выразился по этому вопросу, и я благодарю вас за вашу помощь 🙂

Комментарии:

1. Проблема не на 100% ясна, но, возможно, было бы полезно иметь класс BuildingSet, который может содержать объекты как Building, так и BuildingSet? Тогда у вас мог бы быть BuildingSet x = [b1, b2] и BuildingSet y = [x, b3, b4].

Ответ №1:

Невозможно ответить, не зная структуры ваших решений.

Но, если решение для k можно получить из решения (k-1), вставив здание b в позицию j, тогда вы можете просто использовать hashmap, отображающий целое число i в «дельту» между решением для i и решением для i-1, выраженное парой.

Но необходимость явно иметь дело с дельтами может быть отвратительной, потому что вам нужно выполнить обход, чтобы получить решение. Вы можете решить эту проблему, сообщив delta о ссылочных дельтах (т. Е. передав delta для (k-1) в конструкторе delta для k), а затем предоставив метод getSolution() , который выполняет фактический обход.

Вы можете распространить эту идею на аналогичные структуры решений.

Ответ №2:

Вы можете использовать LinkedHashSet для ключа, а значением является стоимость строительства зданий, содержащихся в наборе, в порядке итерации. Это немного взлом, но в соответствии с хэш-кодом и equals это должно сработать. Если вы предпочитаете быть более явным, используйте хэш-карту set для пары cost и build order.

Ответ №3:

Если ваши решения выглядят как ABC,cost1, ABCD, cost2, создайте связанный список d-> c-> b-> a. Храните решения в виде кортежей cost и ссылки на последний элемент, содержащийся в вашем решении (самый ранний в списке)