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.