1

Тема: Union в DSU...

В чём эвристики в процедуре Юнион в ДСУ?Я пробовал сдавать задачи ,например для МОД,не используя данной эвристики,и результат не менялся.
Хотелось бы чтобы кто-то кто знает рассказал и мне cool

2

Re: Union в DSU...

Никогда не использовал эту эвристику (только сжатие пути в Find).
Почитав Кормена, ничего толком не понял. Наверно практической роли она не играет

test

3

Re: Union в DSU...

coder.ua, посмотри главу "Структуры данных для непересекающихся множеств" в книге Кормена. Там все подробно описано, включая анализ времени работы. А насчет результата, то это сильно зависит от входных данных. Насчет практической ценности... Ну хотя бы от сжатия пути польза интуитивно понятна, по-моему.

4

Re: Union в DSU...

Да, тесты сложно сделать против этих решений без эвристик. Кроме того, если одна какая-то эвристика есть, а другой нет, то dsu будет за O(log N) работать, что делает "отлов" таких плохих dsu совсем безнадёжным делом smile Другое дело, что почему бы не писать "лучшее" dsu - там всего-то надо пару строк добавить

5

Re: Union в DSU...

Согласен cool
Мне кажется, что при двухпроходном файндсэте нужда в какой-либо эвристике в юнионе уже пропадает, так ведь?

6

Re: Union в DSU...

Нет, это будет лишь одна из эвристик (сжатие пути). А вторая всё равно нужна для достижения гарантированно константной асимптотики.

7

Re: Union в DSU...

Я снова в заблуждении yikes
Вот 2 моих варианта ЮНИОНа:
1:
  a:=findset(x);
  b:=findset(y);
  dsu[a]:=b;
2:
  a:=findset(x);
  b:=findset(y);
  if random(2)=1 then swap(a,b);
  dsu[a]:=b;

Я не понимаю в чём первый вариант проигрывает второму?(оО)

8

Re: Union в DSU...

Только-что тестировал задачу.В которой не использовал вторую эвристику,и она проиграла по времени задаче с эвристикой в среднем 30%-50%!!!!Но всёравно не понятно почему...В Кормене как-то всё не размыто^^

9

Re: Union в DSU...

Дело в том, что вся эвристика заключается в том, что бы меньшее множество присоединять к большему, так как если к большему прибавлять меньшее то размер множества не увеличится больше чем в два раза, но если присоединить наооброт, то меньшее множество возрастёт во много раз, и теперь проход по нему составит большее кол-во операций. И того получаем эвристику присоединять меньшее множество к большему! Тогда сложность не превзойдёт NlogN.
Так же если не учитывать размеры,а просто присоединять рандомно "random(2)=1 .." то тоже будет достигаться такая же сложность, за счёт балансирования множества рандомом (это общеожидаемый факт). А вот твой первый метод просто берёт всегда первое и конектит ко второму, из-за чего сложность резко возрастает, и приближается к N^2.
Поэтому всегда советуют писать либо рандомную балансировку, или эвристику по рангам (по размерам множества).

10

Re: Union в DSU...

brainail пишет:

Дело в том, что вся эвристика заключается в том, что бы меньшее множество присоединять к большему, так как если к большему прибавлять меньшее то размер множества не увеличится больше чем в два раза, но если присоединить наооброт, то меньшее множество возрастёт во много раз, и теперь проход по нему составит большее кол-во операций. И того получаем эвристику присоединять меньшее множество к большему! Тогда сложность не превзойдёт NlogN.
Так же если не учитывать размеры,а просто присоединять рандомно "random(2)=1 .." то тоже будет достигаться такая же сложность, за счёт балансирования множества рандомом (это общеожидаемый факт). А вот твой первый метод просто берёт всегда первое и конектит ко второму, из-за чего сложность резко возрастает, и приближается к N^2.
Поэтому всегда советуют писать либо рандомную балансировку, или эвристику по рангам (по размерам множества).

Имелось ввиду что findset будет использовать эвристику сжатия путей, по этому квадратичной сложность не станет. Другое дело, она может стать O(NlogN), но опять таки, это в теории.

11

Re: Union в DSU...

Ну сжатие путей это понятно! Но и правильно присоединять множество тоже нужно.

12

Re: Union в DSU...

brainail пишет:

Ну сжатие путей это понятно! Но и правильно присоединять множество тоже нужно.

Ну если присоединять неправильно, то сложность квадратичной все равно не станет.

13

Re: Union в DSU...

Но ассимптотика будет хуже!) Всё закрыли тему):D