Здесь разбивка алгоритма union/find для непересекающихся лесных массивов на wikipedia:
- Barebone disjoint-set forest... (
O(n)
)- ... с объединением по рангу... (теперь улучшено до
O(log(n)
)- ... с сжатием пути (теперь улучшено до
O(a(n))
, эффективноO(1)
)
- ... с сжатием пути (теперь улучшено до
- ... с объединением по рангу... (теперь улучшено до
Реализация объединения по рангу требует, чтобы каждый node сохранял поле rank
для целей сравнения. Мой вопрос в том, является ли объединение по рангам таким дополнительным пространством? Что произойдет, если я пропущу объединение по рангам и вместо этого сделаю сжатие пути? Это достаточно хорошо? Какова теперь амортизированная сложность?
Сделан комментарий, который подразумевает, что объединение по рангу без сжатия пути (амортизация O(log(n)
сложность) является достаточным для большинства практических приложений. Это верно. То, что я спрашиваю, это наоборот: что, если вы пропустите союз по рангу и ТОЛЬКО сделаете сжатие пути?
В некотором смысле, сжатие путей - дополнительный шаг для улучшения объединения по рангу, и почему этот дополнительный шаг можно опустить без катастрофических последствий. Но является ли объединение по рангу необходимым промежуточным шагом для сжатия пути? Могу ли я пропустить его и перейти прямо к сжатию пути, или это будет катастрофическим?
Было также указано, что без объединения по рангу повторные союзы могут создать структуру с подобным списком. Это означает, что операция сжатия одного тракта может принимать O(n)
в худшем случае. Это, конечно же, повлияет на будущие операции, поэтому, как это происходит, когда амортизируются многие операции, меня больше интересует.