Проблема:
У меня есть большой двойной (2d) массив, заполненный различными метками.Каждый элемент (ячейка) в массиве double содержит набор меток, а некоторые элементы в массиве double могут быть пустыми.Мне нужен алгоритм для группировки элементов в двойном массиве в отдельные сегменты.Сегмент определяется как набор пикселей, которые находятся рядом в двойном массиве, и одна метка, которая является общей для всех этих пикселей в сегменте.(Диагональная смежность не считается, и я не кластеризирую пустые ячейки).
|-------|-------|-------|
| Jane | Joe | |
| Jack | Jane | |
|-------|-------|-------|
| Jane | Jane | |
| | Joe | |
|-------|-------|-------|
| | Jack | Jane |
| | Joe | |
|-------|-------|-------|
В приведенном выше расположении меток, распределенных по девяти элементам, самый большой кластер - это кластер «Jane», занимающий четыре верхнихлевые ячейки.
Что я учел:
Я рассмотрел итерацию по каждой метке каждой ячейки в двойном массиве и тестирование, чтобы увидеть,Проверяемая комбинация меток может быть связана с уже существующим сегментом.Если проверяемый элемент не может быть связан с уже существующим сегментом, он становится первым членом нового сегмента.Если комбинация метка / ячейка может быть связана с уже существующим сегментом, который она ассоциирует.
Конечно, чтобы сделать этот метод разумным, мне пришлось бы реализовать сложную систему хеширования.Я должен был бы отслеживать все комбинации меток ячеек, которые стоят рядом с существующими сегментами и находятся на пути увеличения индексов, которые повторяются через двойной массив.Этот хеш-метод позволит избежать необходимости повторять каждый пиксель в каждом существующем сегменте, чтобы найти смежность.
Почему мне это не нравится:
Как иПриведенный выше алгоритм не учитывает случай, когда элемент в двойном массиве может быть связан с двумя уникальными сегментами, один в горизонтальном направлении и один в вертикальном направлении.Чтобы правильно обрабатывать эти случаи, мне нужно будет выполнить тест для этого конкретного случая, а затем реализовать метод, который будет связывать проверяемый элемент с сегментом, а затем объединять два смежных идентичных сегмента.
НаВ целом, этот метод и запутанная система хеширования, которую он потребует, кажутся очень не элегантными.Кроме того, меня действительно интересует только поиск больших сегментов в двойном массиве, и я гораздо больше обеспокоен скоростью этого алгоритма, чем точностью сегментации, поэтому я ищу лучший путь.Я предполагаю, что есть некоторый стохастический метод для этого, о котором я даже не думал.
Есть предложения?
Редактировать:
Мой желаемый результатэто список сегментов, каждый сегмент является меткой и списком точек.Поэтому в приведенном выше примере я хотел бы, чтобы два сегмента были возвращены:
Segment 1 - Jane: (1,3), (2,3), (1,2), (2,2)
Segment 2 - Joe: (2,3), (2,2), (2,1)