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