Пример алгоритма O (n * log n)
(где n - количество элементов матрицы)
Идея алгоритма заключается в следующем.
- Инициализировать набор деревьев необработанных элементов U , добавив в него все матричные элементы
- Пока U еще не пусто, возьмите любой u из U и проверьте его значение
- Если u = '0', просто удалите его, то есть U : = U \ {u}
- Если u = '1', то начать исследование DFS (u, U)
Где процедура DFS (u, U) использует матрицу для исследования соседей '1' u .
Однако здесь идет кикер, DFS (u, U) также удаляет каждый обнаруженный элемент из U .
Довольно легко понять и доказать, что этот алгоритм действительно всегда заканчивается в O (n * log n). Удаление элемента из набора деревьев имеет сложность O в худшем случае (log n). Каждый прогон DFS (u, U) может посещать не более | U | элементов, и каждый элемент, посещаемый любым способом, удаляется из U по мере выполнения , Алгоритм завершается, когда U становится пустым.
Краткое резюме
Можно создать алгоритм O (n ^ 2) , например, запустив DFS для каждого элемента независимо от ваших ранее полученных знаний.
Использование любого механизма, гарантирующего, что вы не запускаете DFS на уже обнаруженной группе / острове, может привести к превосходному алгоритму.
Извините, что я не могу проанализировать ваш собственный алгоритм напрямую, но это может помочь вам сделать это самостоятельно.