inflearn logo
강의

Course

Instructor

[MMORPG Game Development with C++ and Unreal Engine Series] Part 3: Data Structures and Algorithms

Disjoint Set

Disjoint Set 질문있습니다

429

kimbaksa0220

1 asked

0

위 코드의 전체적인 구조를 보면

2

3__ 1

____10

이고

여기서 만약 Find(10)을 실행한다면

이 코드에 의해

2

3 1 10

이렇게 구조가 바뀔 텐데

_rank[2]의 값이 3에서 바뀌지 않는데

_rank 수정 코드도 필요하지 않나요?

기술면접

Answer 1

4

tanvely

도움이 될 진 모르지만 저도 이 질문 보고 거의 일주일 넘게 답을 찾아 헤매서.. 지나가다 궁금해 하시는 분 계실까봐 댓글 답니다.

위키에 이렇게 적혀있네요.

While the rank of a node is clearly related to its height, storing ranks is more efficient than storing heights. The height of a node can change during a Find operation, so storing ranks avoids the extra effort of keeping the height correct.

https://en.wikipedia.org/wiki/Disjoint-set_data_structure#Union_by_rank

해석하면

노드의 순위는 그 높이와 분명히 관련이 있지만, 순위를 저장하는 것이 높이를 저장하는 것보다 더 효율적이다. 찾기 작업 중에 노드의 높이가 변경될 수 있으므로 순위를 저장하면 높이를 정확하게 유지할 필요가 없습니다.

그래서 곰곰히 생각해 본 결과 find 연산 시 최적화를 위해 경로 압축 방법을 사용하고, union 연산 시 최적화를 위해 union by rank 방법을 사용하기 때문에 서로 다른 범위?라고 생각하는 게 전 제일 마음이 편했습니다..

한 번 매겨진 랭크는 증가만 할 뿐 딱히 감소하는 건 아닌 것 같네요. 랭크가 높을수록 union 연산을 많이 했다는 증거니, 아무래도 많은 쪽에 붙이는 게 확률적으로 이득이라 by rank나 by size 도 그런 비슷한 원리에서 나온 방법들 같다고 혼자 결론지었습니다..

저도 정확히 알고 싶은데.. 아직도 너무나 궁금합니다..ㅠㅠㅠ 혹시 정확히 알고 계신 분이 있으시다면 언제라도 좋으니 시원하게 알려주시면 감사하겠습니다.

(- -)(_ _)

헤더파일에 관한 질문

0

437

1

이진 탐색 트리 삭제 질문

0

700

1

해당 문제 유형을 수학적으로 표현 가능할까요?

0

505

1

vs2022 미로 줄간격

0

1589

2

pos 구조체 초기화 문제

0

498

0

맵이 이상하게 나오는데 무슨 문제인가요?

0

513

1

자동완성 기능 질문

1

521

2

push_back emplace_back 질문있습니다.

0

397

1

Container, Predicate 질문입니다.

0

395

1

_size - 2 질문

0

417

1

우선순위 큐 구현 연습 intellisense 질문

0

401

1

int32 관련 질문

0

278

1

c++에서 처음 보는 문법

0

385

1

학습에 크게 지장이 있는건 아니지만 단순 궁금해서 질문드립니다

0

324

1

힙 정렬과 병합 정렬

0

424

1

resize 질문

0

261

1

처음 보는 for문 문법

0

387

1

환경 설정.. 궁금점

0

388

1

이 비교 연산자를 넣어주는 이유가 있나요?

0

287

1

소멸자 관련 질문

0

250

1

&의 차이

0

290

1

프레임 관리 질문입니다.

0

332

1

연산자 오버로딩 관련 질문입니다.

1

203

1

안녕하세요 goormide 학습자입니다.

0

861

4