Я читал о проблеме объединения-поиска. Двумя основными улучшениями являются сжатие путей и объединение по рангу. Насколько я понимаю, союз по рангу используется для определения того, как объединить непересекающиеся деревья. Если мы имеем два непересекающихся дерева T1 и T2, то мы присоединяем корень дерева меньшего ранга к дереву с более высоким рангом. Если мы не используем сжатие пути, то ранг - это только глубина дерева. Это имеет смысл, поскольку мы не хотим увеличивать глубину дерева, поскольку оно напрямую влияет на оба находок и союзов.Как сжатие и объединение по рангам дополняют друг друга?
Моя проблема в том, что мы используем также сжатие пути. Я продолжаю читать, что две оптимизации дополняют друг друга, но я этого не вижу. Из-за сжатия пути ранг больше не является глубиной дерева (он становится верхней границей по глубине). Предположим, что T1 имеет 2 ответвления (пусть ранг T1 равен 3), а T2 имеет глубину 2 и ранг 2. Теперь предположим, что мы выполняем операцию поиска (с сжатием пути) на листе T1, отмеченном «*» ниже. Теперь, если мы объединяем корень из T1 и корень из T2, тогда T2 будет присоединен к корню T1 (так как ранг не обновляется поиском). Полученное дерево имеет глубину 3. Но мы могли бы иметь лучшую производительность, если бы мы привязали T1 к T2.
T1: o (Rank = 3) T2: o (Rank = 2)
/\ |
o o o
| |
o o
|
*
После находки на листе T1 ("*"), то объединение на корнях Т1 и Т2 мы получаем
T1: o (Rank = 3) T2: o (Rank = 2)
/| |\ |
* o o o o
|
o
Result of T1 union T2
o
/| | |\
* o o o o Rank = 3 and Max Depth = 3
|
o
|
o
Я-то здесь отсутствует? Как сжатие путей и объединение по рангам дополняют друг друга? Я знаю, что ранг - это только верхняя граница по глубине дерева, но я не вижу, как объединение по рангу улучшает общую производительность структуры. Как это лучше, чем союз, который случайно объединяет корни?
Спасибо за помощь заранее.
Почему вы говорите: «Мы могли бы улучшить производительность, если бы присоединили T1 к T2»? Если за союзом последовала, скажем, находка на каждом узле, то это привело бы к гораздо большему количеству работы. –
Мое понимание лучшей производительности в том, что если дерево глубже, то находит, и союзы занимают больше времени, чтобы найти своего главного представителя (корень) - последующие операции поиска и объединения будут выполняться быстрее из-за сжатия пути. Но это была просто работа сжатия пути. Я просто не понимаю, как объединение по рангам повышает производительность, потому что ранг точно не отражает глубину дерева.Думаю, мой вопрос может быть лучше - что я потеряю, если я просто реализую это с помощью только сжатия пути и почему? – Hermon