한 번만 (데이터 세트 당) 문제를 해결해야한다고 가정하면 간단한 접근은 한 노드에서 (자체와 함께) 조상 세트를 수집 한 다음 다른 서버에서 조상 목록을 이동할 때까지 반드시 가장 낮은 공통 조상 인 위 집합의 구성원을 찾으십시오. 이 의사 코드가 주어진다
Let A and B begin as the nodes in question.
seen := set containing the root node
while A is not root:
add A to seen
A := A's parent
while B is not in seen:
B := B's parent
B is now the lowest common ancestor.
다른 방법은 그 후, 각 노드는 전체 경로 간 공간을 계산 공통 접미사 찾고 오른쪽에서 스캔한다. 첫 번째 요소는 LCA입니다. 어느 쪽이 빠른지는 데이터에 따라 다릅니다. 당신이 노드의 여러 쌍의 LCA를 찾을 필요하게 될 경우
는, 당신은 다양한 공간/시간 절충 할 수 있습니다 : 당신은, 예를 들어, 각 노드의 깊이를 미리 계산할 수
을하는 더 깊은 노드에서 더 얕은 노드의 깊이로 먼저 걸어서 잠금 단계에서 두 노드를 루트쪽으로 걸어 갈 때마다 매번 세트 (또는 경로)를 다시 만드는 것을 피할 수 있습니다. 이러한 경로가 만나는 경우 LCA를 가져야한다.
또 다른 접근법은 깊이 - mod-H에서 다음 조상을 가진 노드에 주석을 달아서, 당신이 먼저 비슷한 문제가있는 H-times-smaller 문제와 H-sized 문제의 첫 번째 문제를 푸는 것입니다. 이것은 매우 깊은 나무에서 좋으며, H는 일반적으로 나무의 평균 깊이의 제곱근으로 선택됩니다.
출처
2010-08-22 14:44:00
Ian
한 가지 덧글 : 나무는 주로 (대부분) 균형을 이룹니다. 이러한 경우 분리 된 집합 데이터 구조를 사용하는 오버 헤드는 u에서 루트까지 간단히 표시 한 다음 v에서 첫 번째로 표시된 노드에 대한 루트까지 검색하는 것보다 비용이 많이 듭니다. – Rafe