Эти два концептуально эквивалентны: набор S
содержит в точности серые узлы, а алгоритмы одинаковы в противном случае.
На практике, однако, есть тонкие различия:
- Если набор
S
является реализацией на основе хеша, то узлы должны быть хэшируемыми.Если хеш-функция плохо спроектирована или данные выбираются по ошибке, производительность может снизиться. - Если набор
S
является реализацией на основе дерева, то узлы должны быть сопоставимы.Кроме того, у вас больше нет (амортизированного) поиска по постоянному времени. - Если используются цвета, то узлы должны иметь поле «цвет», которое не используется для других целей.Тем не менее, это дает самый быстрый «поиск по множеству», так как это всего лишь один поиск / сравнение.
- Если график направлен или отключен, то вам придется выполнять DFS несколько раз (из всех белых узлов).Отслеживание того, был ли посещен узел, требует второго набора, так как первый набор всегда пуст в конце DFS.Поскольку в действительности существует три «состояния» узла, для хранения этой информации требуется 2 набора.
В критических для производительности ситуациях цветной подход будет иметь меньшие постоянные коэффициенты для линейного времени выполнения.Но если добавление поля color
к узлам не является вариантом, то использование множеств является хорошей альтернативой.Если узлы в настоящее время реализованы как int
s или String
s (в отличие от Node
класса с возможностью добавления полей), тогда подход на основе набора будет легче кодировать, поскольку вы можете избежать изменения представления узлов.