Prim과 반대로 Kruskal을 언제 사용해야합니까?


194

Prim의 알고리즘을 사용해야 할 때와 Kruskal이 언제 최소 스패닝 트리를 찾을 수 있는지 궁금합니다 . 둘 다 쉬운 논리를 가지고 있으며 최악의 경우와 같으며 약간 다른 데이터 구조가 포함될 수있는 구현 만 다릅니다. 그렇다면 결정 요인은 무엇입니까?

답변:


201

가장자리가 많은 그래프가있는 경우 Prim의 알고리즘을 사용하십시오.

V 정점 E 모서리가 있는 그래프 의 경우 Kruskal의 알고리즘은 O (E log V) 시간으로 실행되고 Prim의 알고리즘은 Fibonacci Heap 을 사용하는 경우 O (E + V log V) 상각 시간으로 실행될 수 있습니다 .

정점보다 가장자리가 더 많은 고밀도 그래프가있는 경우 Prim의 알고리즘이 한계에서 훨씬 빠릅니다. Kruskal은 단순한 데이터 구조를 사용하기 때문에 일반적인 상황 (스파 스 그래프)에서 더 잘 수행됩니다.


8
평균 대신 "일반적인 상황"이라고 말하고 싶습니다. 예를 들어 해시 테이블의 "평균 크기"와 같이 사용하기 어려운 용어라고 생각합니다. 몰라.
yairchu

2
@SplittingField : 사과와 오렌지를 비교한다고 생각합니다. 할부 상환 분석은 함수를 측정하는 방법 (간단히 말해서)으로 간단합니다. 최악의 경우이든 평균적인 경우가 입증 한 내용에 따라 다릅니다. 실제로 (지금 살펴보면) 위키 기사는 최악의 분석 에만 사용되는 언어를 사용합니다. 이제 이러한 분석을 사용하면 특정 작업 비용에 대한 강력한 약속을 할 수는 없지만 알고리즘이 실행될 때 실제로는 최악의 경우에도 O (E + VlogV)에 의해 결정됩니다.
agorenst

10
이론적으로는 좋은 소리이지만 피보나치 힙을 구현할 수있는 사람은 거의 없습니다.
Alexandru

2
@tgamblin, 최악의 경우 C (V, 2) 모서리가있을 수 있습니다. 그렇다면 Prim의 알고리즘의 시간 완성이 피보나치 힙의 경우 O (V ^ 2 + VlogV) 즉 O (V ^ 2)로 줄어들지 않습니까?
그린 고블린

7
또 다른 중요한 요소가 있습니다 : Prims의 출력은 그래프가 연결된 경우에만 MST입니다 (출력은 다르게 사용되지 않는 것 같습니다). 그러나 Kruskal의 출력은 최소 스패닝 포리스트입니다 (일부 사용).
Andrei I

102

나는 그물에서 매우 간단한 방법으로 차이점을 설명하는 아주 좋은 스레드를 발견했습니다 : http://www.thestudentroom.co.uk/showthread.php?t=232168 .

Kruskal의 알고리즘은 사이클을 생성하지 않는 한 가장 저렴한 에지를 추가하여 가장 저렴한 에지에서 솔루션을 성장시킵니다.

Prim의 알고리즘은 현재 솔루션에 없지만 가장 저렴한 가장자리에 연결된 정점 인 다음으로 가장 저렴한 정점을 추가하여 임의의 정점에서 솔루션을 성장시킵니다.

여기에 해당 주제에 대한 흥미로운 시트가 첨부되어 있습니다.여기에 이미지 설명을 입력하십시오여기에 이미지 설명을 입력하십시오

Kruskal과 Prim을 모두 최적의 형태로 구현하는 경우 : union find와 finbonacci heap을 사용하여 Prim과 비교하여 Kruskal이 어떻게 구현되는지 쉽게 알 수 있습니다.

그래프 노드와 힙 노드 사이의 양방향 링크를 기록하기 위해 장부 관리 테이블을 유지해야하기 때문에 주로 피보나치 힙을 사용하는 것이 더 어렵습니다. Union Find를 사용하면 반대입니다. 구조가 간단하며 추가 비용없이 mst를 직접 생성 할 수도 있습니다.


2
Nitpick : 각각의 마지막 '슬라이드'는 "스패닝 트리가 생길 때까지 반복"으로 표시되어야합니다. 재귀 적 인 작업 인 MST가 될 때까지는 아닙니다. 최소한 것을 어떻게 알 수 있습니까? 그래서 Prim / Kruskal의 관심을 끌고 있습니다!
OJFord

@OllieFord 나는 Prim과 Kruskal 알고리즘의 간단한 그림을 검색 한이 스레드를 발견했습니다. 알고리즘은 트리를 찾고 해당 트리가 MST임을 보증합니다. 그리고 당신은 당신이 정확하게 V-1 가장자리 가있을 때 나무를 찾았다는 것을 알고 있습니다 .
mikedu95

@ mikedu95 당신은 정확합니다, 다른 각도에서 내 이전 의견과 같은 점을 만듭니다.
OJFord

그러나 정점 사이의 단일 가중치로만 선택해야하는 전제 조건이 아니고 위 그래프에서 가중치 2를 두 번 이상 선택할 수 없으며 다음 가중치를 선택해야합니다. ex : 3 @Snicolas
ani0904071

30

나는 당신이 이것을 요구하지 않았다는 것을 알고 있지만, 더 많은 처리 장치를 가지고 있다면 , 쉽게 병렬화 될 수 있기 때문에 Borůvka의 알고리즘을 고려해야합니다. 따라서 Kruskal 및 Jarník-Prim 알고리즘보다 성능 이점이 있습니다.


23

Kruskal은 가장자리를 선형 시간으로 정렬하거나 이미 정렬 한 경우 성능이 향상 될 수 있습니다.

꼭지점에 대한 가장자리 수가 많을수록 더 좋습니다.


19

Kruskal 시간 복잡성 최악의 경우는 O (E log E) 입니다. 이는 가장자리를 정렬해야하기 때문입니다. 프림 시간 복잡도 최악의 경우는 O (E 로그 V)우선 순위 큐 또는 더 나은, O (E + V 로그 V)피보나치 힙 . 그래프가 드문 경우, 즉 E = O (V)와 같이 작은 수의 가장자리가 이미 정렬되어 있거나 선형 시간으로 정렬 할 수있는 경우 Kruskal을 사용해야합니다. 그래프가 밀도가 높을 때 Prim을 사용해야합니다. 즉, E = O (V²)와 같이 모서리 수가 높습니다.


Prim은 Kruskal보다 속도면에서 결코 나쁘지 않습니다. E는 V-1 이상이어야하므로 스패닝 트리가 있습니다. 희소 그래프에 대해 Kruskal을 선호하는 이유는 데이터 구조가 매우 간단하기 때문입니다.
Yu Gu

16

중간 프라임의 알고리즘에서 알고리즘을 중지하면 항상 연결된 트리가 생성되지만 kruskal은 트리 또는 포리스트의 연결을 끊을 수 있습니다.


5

Kruskal 알고리즘의 중요한 적용 중 하나는 단일 링크 클러스터링 입니다.

n 개의 꼭짓점을 고려하고 완전한 그래프를 갖습니다. 그 n 점의 ak 군집을 구하려면 정렬 된 모서리 세트의 첫 번째 n- (k-1) 모서리에 대해 Kruskal의 알고리즘을 실행합니다. 간격.


3

Kruskal의 가장 좋은 시간은 O (E logV)입니다. Prim의 fib 힙을 사용하는 경우 O (E + V lgV)를 얻을 수 있습니다. 따라서 밀도가 높은 그래프에서는 Prim이 훨씬 좋습니다.


2

Prims는 밀도가 높은 그래프에 더 적합하며, 여기서는 주로 노드를 처리하므로 에지를 추가하여주기에 많은주의를 기울일 필요가 없습니다. 복잡한 그래프의 경우 Prim은 Kruskal보다 빠릅니다.


2

kruskal 알고리즘에서 우리는 주어진 그래프에 많은 수의 모서리와 꼭짓점의 수를 가지지 만 각 가장자리에 우리는 순환하지 않거나 어느 쪽에서도 가깝지 않아야하는 새로운 그래프를 준비 할 수있는 값이나 무게를 가지고 있습니다

이와 같은 그래프 _____________ | | | | | | | __________ | | 모든 정점 a, b, c, d, e, f에 이름을 지정하십시오.

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