Я недавно читал о структуре данных disjoint-set-union.Я запутался насчет ранга эвристического.Я прочитал, что «ранг не высота дерева».
Я не могу найти это требование правильным.Дело в том, что когда для объединения используется эвристика ранга, мы можем легко увидеть, что ранг - это высота набора деревьев, но когда мы используем сжатие пути с ним, ранг больше не является высотой.Но, тем не менее, мы выполняем объединение с учетом ранга дерева.
Предположим, я звоню find (a1) и find (a2), это должно изменить ранг родителя a1 и a2, если высота родительского элементаa1 лежит в пути от корня до a1 (то же самое для a2).
Как работает это сжатие пути, когда ранга больше нет высоты дерева?Что представляет собой ранг дерева при использовании сжатия путей.
Ниже приведен код для функции поиска и объединения.Это не «полная программа».Но их можно легко превратить в одно целое.
int find(vector<int>& parent, int i) {
if (parent[i] != i)
parent[i] = find(parent, parent[i]);
return i;
}
void union(vector<int>& parent, vector<int>& rannk, int x, int y) {
int xroot = find(parent, x);
int yroot = find(parent, y);
if (rank[xroot] < rank[yroot])
parent[xroot] = yroot;
else if (rank[xroot] > rank[yroot])
parent[yroot] = xroot;
else{
parent[yroot] = xroot;
rank[xroot]++;
}
}
int main() {
vector<int> parent(10), rank(10, 1);
for(int i = 0; i < 10; ++i)
parent[i] = i;
union(2, 5);
union(1, 3);
union(2, 7);
union(2, 1);
union(9, 8);
union(0, 8);
union(0, 1);
}
Для понимания приведено лишь несколько основных функций.
parent [i] представляет родителя элемента i, 0 <=i <= 10 rank [i] представляет ранг i (корня) набора, 0 <= i <= 10 </p>
Как вы можете легко видеть, после каждого вызова find () путь сжимается изузел к его родителю (теперь он напрямую связан с родителем).Теперь ранг не высота дерева.
Этот код использует ранг [] для определения слияния.Что представляет собой ранг [i] и как он помогает принять решение о слиянии двух множеств в union ()?