Операции с непересекающимися подмножествами
for (i = 1; i <= n; i++) w[i] = i; // w[i] – метка дерева
while (cin >> p>> q)
{
i = w[p]; j = w[q];
if (i != j)
{ cout << p <<‘ ‘<< q<< endl;
w[p] = j;
for (k = 1; k <= n; k++)
if (w[k] == i) w[k] = j;
}
}
Поиск: O(1)
Объединение: O(n)
int i, j, p, q, w[N];
for (i = 0; i < N; i++) w[i] = i;
while (fin >> p >> q){
for (i = p; i != w[i]; i = w[i]) ; // i == w[i]
for (j = q; j != w[j]; j = w[j]) ; // j == w[j]
if (i == j) continue;
w[i] = j;
cout << "+ребро: " << p << " " << q << endl;
}
Обобщение этой идеи см. далее
Операции с непересекающимися подмножествами
Операции с непересекающимися подмножествами
Операции с непересекающимися подмножествами
Реализация 1
Линейные списки
Абстрактная реализация (ссылки на представителя). Пример Union
Реализация 1. Линейные списки
i
i -1
2
1
i + 1
Суммарная стоимость n + Σi=1..n-1 i = Θ(n2)
Реализация 1. Линейные списки
Весовая эвристика
Реализация 1. Линейные списки. Весовая эвристика
Реализация 1. Линейные списки
Ср. не оч. быстрый поиск – быстрое объединение
(лекция 5)
Union
Реализация 2. Лес непересекающихся подмножеств
Всего O(n). Здесь: Find ~ O(1)
!!! Ср. с предыдущим слайдом (отличие при Union с равными рангами). Здесь корнем будет первый аргумент.
Сценарий 2 (продолжение)
Find ( a )
Proc Union (x, y);
begin
Link ( Find (x), Find (y) )
end {Union}
{Link – объединение по
рангам, см. далее}
Без доказательства:
Только объединение по рангу → O ( k log n)
+ сжатие путей → O ( k α(k, n) ), где α(k, n) ≤ 4 (практически)
Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:
Email: Нажмите что бы посмотреть