Я столкнулся с довольно интересной проблемой. У меня есть (довольно большое) количество блоков. Блок - это просто что-то, начинающееся со смещения и имеющее длину и цвет. Смещение и длина ограничены - пространство, в котором существуют эти блоки, составляет <0-N>, где N варьируется от сотен тысяч до нескольких миллионов. Недопустимый блок - это любой блок со смещением больше N или суммой смещения и длины больше N. Блок может иметь около 16 различных цветов (только один из них).
Может быть тысячи блоков, и всегда есть ситуации, подобные этой:
block_X: off: 100, len: 50, цвет: синий
block_Y: off: 148, len: 50, цвет: синий
block_Z: off: 200, len: 30, цвет: красный
Как видите, блоки X и Y могут быть соединены в один больший блок, в результате чего:
block_XY: off: 100, len 98, цвет: синий
block_Z: off 200, len 30, цвет: красный
Я хотел бы создать алгоритм, который будет проходить через все блоки и соединять те, которые перекрываются и имеют одинаковый цвет. На самом деле, если промежуток между блоками достаточно мал (константа, которую я мог бы выбрать, скажем, около 16 или около того, но может быть любым числом ...), тогда я бы все равно хотел соединить эти блоки. Обратите внимание, что в приведенном выше примере подключены только два блока. На самом деле последовательность блоков, которые можно подключить, в большинстве случаев намного длиннее.
Есть также интересный поворот, учтите это:
block_A: off: 100, len: 200, цвет: синий
block_B: off: 200, len: 200, цвет: синий
block_C: off: 300, len: 150, цвет: red
block_D: off: 400, len: 200, цвет: синий
block_E: off: 500, len: 200, цвет: синий
Как видите, у нас есть хорошая последовательность синих блоков, которые можно объединить в один большой синий блок. Тем не менее, есть также маленький красный блок в середине этого. Это не должно обманывать алгоритм, правильный результат:
block_ABDE: off: 100, len: 600, цвет: синий
block_C: off: 300, len: 150, цвет: красный
Данные хранятся в std :: multimap, где ключом является смещение, а значением является структура, содержащая длину и цвет блока, что-то вроде: multimap<uint32_t,pair<uint32_t, uint8_t> >
. Обратите внимание, что могут быть блоки, начинающиеся с одинакового смещения. Однако гарантируется, что если это произойдет, блоки, начинающиеся с одного и того же смещения, будут иметь разные цвета и разную длину.
Может кто-нибудь придумать хорошую идею, как эффективно решить эту проблему? Цель алгоритма - уменьшить количество имеющихся у нас блоков, но НЕ обязательно уменьшать его до минимально возможного количества.