Prim의 알고리즘을 사용해야 할 때와 Kruskal이 언제 최소 스패닝 트리를 찾을 수 있는지 궁금합니다 . 둘 다 쉬운 논리를 가지고 있으며 최악의 경우와 같으며 약간 다른 데이터 구조가 포함될 수있는 구현 만 다릅니다. 그렇다면 결정 요인은 무엇입니까?
Prim의 알고리즘을 사용해야 할 때와 Kruskal이 언제 최소 스패닝 트리를 찾을 수 있는지 궁금합니다 . 둘 다 쉬운 논리를 가지고 있으며 최악의 경우와 같으며 약간 다른 데이터 구조가 포함될 수있는 구현 만 다릅니다. 그렇다면 결정 요인은 무엇입니까?
답변:
가장자리가 많은 그래프가있는 경우 Prim의 알고리즘을 사용하십시오.
V 정점 E 모서리가 있는 그래프 의 경우 Kruskal의 알고리즘은 O (E log V) 시간으로 실행되고 Prim의 알고리즘은 Fibonacci Heap 을 사용하는 경우 O (E + V log V) 상각 시간으로 실행될 수 있습니다 .
정점보다 가장자리가 더 많은 고밀도 그래프가있는 경우 Prim의 알고리즘이 한계에서 훨씬 빠릅니다. Kruskal은 단순한 데이터 구조를 사용하기 때문에 일반적인 상황 (스파 스 그래프)에서 더 잘 수행됩니다.
나는 그물에서 매우 간단한 방법으로 차이점을 설명하는 아주 좋은 스레드를 발견했습니다 : http://www.thestudentroom.co.uk/showthread.php?t=232168 .
Kruskal의 알고리즘은 사이클을 생성하지 않는 한 가장 저렴한 에지를 추가하여 가장 저렴한 에지에서 솔루션을 성장시킵니다.
Prim의 알고리즘은 현재 솔루션에 없지만 가장 저렴한 가장자리에 연결된 정점 인 다음으로 가장 저렴한 정점을 추가하여 임의의 정점에서 솔루션을 성장시킵니다.
여기에 해당 주제에 대한 흥미로운 시트가 첨부되어 있습니다.
Kruskal과 Prim을 모두 최적의 형태로 구현하는 경우 : union find와 finbonacci heap을 사용하여 Prim과 비교하여 Kruskal이 어떻게 구현되는지 쉽게 알 수 있습니다.
그래프 노드와 힙 노드 사이의 양방향 링크를 기록하기 위해 장부 관리 테이블을 유지해야하기 때문에 주로 피보나치 힙을 사용하는 것이 더 어렵습니다. Union Find를 사용하면 반대입니다. 구조가 간단하며 추가 비용없이 mst를 직접 생성 할 수도 있습니다.
V-1
가장자리 가있을 때 나무를 찾았다는 것을 알고 있습니다 .
나는 당신이 이것을 요구하지 않았다는 것을 알고 있지만, 더 많은 처리 장치를 가지고 있다면 , 쉽게 병렬화 될 수 있기 때문에 Borůvka의 알고리즘을 고려해야합니다. 따라서 Kruskal 및 Jarník-Prim 알고리즘보다 성능 이점이 있습니다.
Kruskal은 가장자리를 선형 시간으로 정렬하거나 이미 정렬 한 경우 성능이 향상 될 수 있습니다.
꼭지점에 대한 가장자리 수가 많을수록 더 좋습니다.
Kruskal 시간 복잡성 최악의 경우는 O (E log E) 입니다. 이는 가장자리를 정렬해야하기 때문입니다. 프림 시간 복잡도 최악의 경우는 O (E 로그 V) 와 우선 순위 큐 또는 더 나은, O (E + V 로그 V) 와 피보나치 힙 . 그래프가 드문 경우, 즉 E = O (V)와 같이 작은 수의 가장자리가 이미 정렬되어 있거나 선형 시간으로 정렬 할 수있는 경우 Kruskal을 사용해야합니다. 그래프가 밀도가 높을 때 Prim을 사용해야합니다. 즉, E = O (V²)와 같이 모서리 수가 높습니다.