나무에서 뿌리에서 잎까지 가장 긴 경로 찾기


15

나는이 나무를 다음 예와 같이, (그래프 이론의 의미에서) :

여기에 이미지 설명을 입력하십시오

이것은 하나의 시작 노드 (루트)와 많은 끝 노드 (잎)가있는 지시 트리입니다. 각 모서리에는 길이가 지정되어 있습니다.

내 질문은 루트에서 시작하여 나뭇잎에서 끝나는 가장 긴 경로를 찾는 방법입니다. 무차별 접근 방식은 모든 루트 리프 경로를 확인하고 최대 길이의 경로를 사용하는 것이지만 더 효율적인 알고리즘을 선호합니다.


답변:


16

Ran G.는 효율적인 알고리즘에 대한 힌트를 주었지만 세부 사항은 생략했을 것입니다. 모든 루트 리프 경로를 계산하는 것은 실제로 각 경로를 계산 한 다음 길이를 계산하는 경우와 같이 반복해서 작업을 수행하는 경우 약간 비효율적입니다.

다음과 같은 재귀 알고리즘을 수행 LongestPath(root)하면 원하는 것을 얻을 수 있습니다. 기본적으로 각 하위 트리의 가장 긴 경로를 재귀 적으로 계산합니다. 각 노드에서 새 경로를 만들고 가장 긴 경로를 반환해야합니다.

 LongestPath(node)
   If node is a leaf, return (node,0) 
   If node is not a leaf:  
    For each edge (node,length,next):
       Let (p,l) = LongestPath(next)
       Let (path,len) = (p++[next], l + length)
    Return element (path,len) from previous step with largest value len

이것은 하스켈 표기법을 가진 의사 코드의 조합이므로 이해할 수 있기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.