Эта проблема может быть сведена к проблеме в теории графов, когда вы находите все группы связанных узлов в графе.
Эффективным способом решения этой проблемы является выполнение алгоритма "заливки", которыйпо сути, рекурсивное дыхание, первый поиск.Эта запись в википедии описывает алгоритм заполнения потока и его применение для решения проблемы поиска связанных областей графика.
Чтобы увидеть, как исходный вопрос можно превратить в вопрос на графиках: сделайте каждую запись (например, «Сервер1», «Сервер_1» и т. Д.) Узлом на графике.Соедините узлы с ребрами тогда и только тогда, когда они являются синонимами.Матричная структура данных особенно подходит для отслеживания краев, если у вас достаточно памяти.В противном случае будет работать разреженная структура данных, такая как карта, тем более что число синонимов, вероятно, будет ограничено.
- Сервер1 - это узел № 0
- Сервер_1 - это узел № 1
- Сервер_2 - это узел № 2
Тогда edge [0][1] = edge [1] [0] = 1, указывает на наличие ребра между узлами # 0 и # 1 (что означает, что они являются синонимами).Хотя edge [0] [2] = edge [2] [0] = 0, это означает, что Server1 и Server_2 являются , а не синонимами.
Анализ сложности
Создание этой структуры данных довольно эффективно, потому что для ее создания достаточно одного линейного прохода с поиском соответствия строк и номеров узлов.Если вы сохраняете сопоставление строк с номерами узлов в словаре, то это будет O (n log n) шаг.
Выполнение заливки равно O (n), вы посещаете каждый узел на графике только один раз.Итак, алгоритм всего O (n log n).