Ваша находка в союзе разбита по сложности. Пожалуйста, прочитайте Википедия: Структура данных с несвязным набором .
Чтобы union-find имел сложность, близкую к O (1), он должен использовать сжатие путей. Для этого ваш root
метод должен:
- Получите
dict
по ссылке, чтобы он мог его изменить.
- Сделать сжатие пути для всех элементов на пути, чтобы они указывали на корень.
Без сжатия у вас будет сложность O (log N) для root()
, что может быть в порядке. Но для этого вам нужно исправить это так, чтобы root()
получал dict
по ссылке, а не по значению. Передача dict
по стоимости стоит O (N).
Тот факт, что dict
является std::map
, делает любой запрос стоимостью O (log N) вместо O (1). std::unordered_map
стоит O (1), но на практике для N <1000 <code>std::map быстрее. Также, даже если используется std::unordered_map
, хеширование строки стоит O (len (str)).
Если данные большие, а производительность все еще низкая, вы можете выиграть от работы с индексами в pairs
вместо строк и запустить union-find с индексами в vector<int>
. Это подвержено ошибкам, так как вы должны правильно обрабатывать дубликаты строк.