크러스컬 알고리즘
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
크러스컬 알고리즘은 그래프의 최소 신장 트리를 찾는 알고리즘으로, 그래프의 간선들을 가중치 순으로 정렬하고 사이클을 형성하지 않는 간선들을 순차적으로 추가하여 최소 신장 트리를 구성한다. 이 알고리즘은 시간 복잡도 O(E log V)를 가지며, 변형된 알고리즘은 O(E α(V))까지 시간 복잡도를 낮출 수 있다. 크러스컬 알고리즘은 각 정점을 개별 트리로 시작하여 간선을 추가하며, 알고리즘 종료 시 최소 신장 트리를 형성한다. 정확성 증명은 생성된 트리가 순환을 갖지 않고 연결되어 있음을 보이며, 최소 비용임을 수학적 귀납법을 통해 증명한다. 병렬 처리를 위한 변형 알고리즘도 존재한다.
1956년에 Joseph Kruskal영어이 ''Proceedings of the American Mathematical Society''에서 발표한 크러스컬 알고리즘은 탐욕법의 일종으로, 프림 알고리즘, Reverse-delete algorithm영어, 보루프카 알고리즘 등과 함께 최소 신장 트리를 구하는 데 사용된다. 최소 신장 트리는 그래프의 모든 정점을 포함하는 트리로서, 간선 가중치의 총합이 최소인 것을 말한다. 연결되지 않은 그래프에서는 각 연결 부분의 최소 신장 트리 집합인 "최소 신장 숲"을 구할 수 있다.
크러스컬 알고리즘의 정확성은 다음 두 가지 명제를 증명함으로써 보일 수 있다.
2. 알고리즘
크러스컬 알고리즘은 다음 단계를 거친다.
알고리즘이 종료되면 숲은 그래프의 최소 신장 숲을 형성한다. 그래프가 연결되어 있으면 숲은 단일 구성 요소를 가지며 최소 신장 트리를 형성한다.
를 간선의 개수라 하고, 를 꼭짓점의 개수라고 할 때, 간단한 자료 구조를 사용하면 크러스컬 알고리즘은 시간 안에 동작한다고 증명될 수 있다.
2. 1. 기본 알고리즘
크러스컬 알고리즘의 기본 절차는 다음과 같다.
1. 그래프의 각 꼭짓점을 나무(자료구조의 tree)로 하는 숲 ''F''를 만든다.
2. 모든 변을 원소로 갖는 집합 ''S''를 만든다.
3. ''S''가 비어있지 않은 동안:
알고리즘이 종료되면 숲 ''F''는 하나의 최소 비용 신장 부분 그래프를 이룬다.
크러스컬 알고리즘은 그래프에서 변을 제거하는 방식으로도 구현할 수 있다.
1. 그래프에서 꼭짓점 또는 나무를 분리하지 않는 최대 가중치의 변을 제거한다.
2. 그래프에 n-1개의 변만 남을 때까지 위 과정을 반복한다.
3. 그래프에 n-1개의 변이 남으면 최소 비용 생성나무가 된다.[10]
2. 2. 변형 알고리즘 (간선 제거 방식)
크러스컬 알고리즘의 변형 알고리즘은 그래프에서 변을 제거하는 방식으로 작동하며, 다음 단계를 따른다.[10]
# 그래프에서 꼭짓점 또는 나무를 분리해 내지 않는 최대 가중치의 변을 제거한다.
# 그래프에 n-1개의 변만 남을 때까지 위 과정을 반복한다.
# 그래프에 n-1개의 변이 남으면 최소 비용 신장 부분 그래프이다.[10]
2. 3. 복잡도
를 변의 개수라 하고, 를 꼭짓점의 개수라고 하자. 크러스컬 알고리즘은 시간 안에 동작한다고 증명될 수 있다. 간단한 자료 구조가 쓰인다면 안에 동작한다. 이 동작 시간은 동일한데, 그 까닭은 다음과 같다.
이러한 시간 복잡도 한계는 다음과 같은 방법으로 도달할 수 있다. 변들을 그 가중치 순으로 시간 내에 정렬한다. 정렬을 함으로써, "집합 '''S'''로부터 최소 가중치를 갖는 변을 제거한다"는 동작이 상수 시간에 행해질 수 있게 된다. 서로소 집합 자료 구조(유니온 파인드: 결합과 검색)를 이용하여 어떤 꼭짓점이 어떤 콤포넌트(component)에 속하는 지 추적한다. 디스조인트-셋 찾기(find) 동작 두 번에 시간이 걸린다. 각 변이 각각 한 유니언(union) 안에 있다고 가정하면 말이다. 간단한 서로소 집합 자료 구조인 랭크에 의한 합집합을 사용하는 디스조인트-셋 숲(disjoint-set forest with union by rank)를 쓰더라도, 개의 동작이 시간 안에 행해진다. 그러므로 총 시간 복잡도는 가 된다.
변들이 이미 정렬되어 있거나 선형 시간(linear time, ) 안에 정렬될 수 있다면(예를 들어 카운팅 정렬, 기수 정렬), 크러스컬 알고리즘은 좀 더 고도의 서로소 집합 자료 구조를 사용할 수 있다. 이때 동작 시간 복잡도는 가 되는데, 여기서 는 아주 느리게 증가하는 단일-값 아커만 함수의 역함수를 말한다.[1]
그래프의 간선 수를 , 정점 수를 라고 할 때, 크루스칼 알고리즘은 간단한 자료 구조를 사용하면 시간에 실행될 수 있음이 증명될 수 있다. 여기서 는 점근 표기법으로 시간을 나타내며, 는 임의의 밑을 갖는 로그이다( 표기법 내에서는 모든 밑의 로그가 상수 배 차이로 동일하기 때문에 동등하다). 이 시간 복잡도는 고립된 정점이 없는 그래프의 경우 로 대신 표기되는 경우가 많으며, 이 경우 이고 와 의 로그가 다시 상수 배 차이로 동일하기 때문에 동등하다.[2]
이러한 시간 복잡도를 얻기 위해 먼저 비교 정렬을 사용하여 간선을 가중치 순으로 정렬하는 데 시간이 걸린다. 정렬된 후에는 간선을 정렬된 순서대로 상수 시간에 반복할 수 있다. 다음으로, 각 구성 요소에 대해 정점 집합을 사용하여 어떤 정점이 어떤 구성 요소에 속하는지 추적하기 위해 상호 배타적 집합 자료 구조를 사용한다. 각 정점에 대해 별도의 집합을 사용하여 이 구조를 만드는 데는 번의 연산과 시간이 소요된다. 모든 간선에 대한 최종 반복은 각 간선당 두 번의 찾기 연산과 잠재적으로 한 번의 합집합 연산을 수행한다. 이러한 연산은 연산당 상각 시간 시간이 걸리므로, 이 루프에 대한 최악의 경우 총 시간은 가 되며, 여기서 는 매우 천천히 증가하는 역 애커만 함수이다. 이 시간 복잡도 부분은 정렬 단계에 걸리는 시간보다 훨씬 작으므로 알고리즘의 총 시간은 정렬 단계에 걸리는 시간으로 단순화할 수 있다.[2]
간선이 이미 정렬되어 있거나, 계수 정렬 또는 기수 정렬과 같은 정수 정렬 알고리즘을 사용하여 선형 시간에 정렬할 수 있을 만큼 충분히 작은 정수 가중치를 갖는 경우, 상호 배타적 집합 연산이 알고리즘에서 가장 느린 부분이며 총 시간은 이다.[2]
3. 예제
그림 설명 우리가 풀어야 할 그래프이다. 변 옆의 숫자는 가중치를 나타낸다. 지금은 모든 변의 색이 같다. AD 와 CE 가 가장 짧은(가중치가 가장 작은) 변이다. 아무거나 골라서 AD를 선택하고 색을 변경하였다. 이제, CE가 가중치가 5로서, 고리(loop)를 생성하지 않는 가장 짧은 변이다. CE의 색을 변경하였다. 같은 방식으로 고르면 다음 변은 DF이다. 가중치는 6이다. 다음으로 가장 짧은 변은 AB와 BE인데, 둘 다 길이 (= 가중치)가 7이다. 임의로 AB를 골랐다. BD는 빨강색으로 변경하였는데, ABD를 연결시키면 루프를 이루기 때문이다. 다음으로 가장 짧은 변은 BE로서 길이 7이다. 더 많은 변들이 빨강으로 변했다. BCE 루프를 생성하기 때문에 BC가 빨강색으로 변했으며, DEBA 루프를 생성하기 때문에 DE가 빨강색으로 변했고, FEBAD 고리를 생성하기 때문에 FE가 빨강색으로 변했다. 끝내, EG가 연결되면서 알고리즘이 종료된다. 최소 비용 신장 부분 그래프가 완성되었다.
4. 정확성 증명
1. 크러스컬 알고리즘은 신장 트리를 생성한다.
2. 크러스컬 알고리즘으로 생성된 신장 트리는 최소 비용을 갖는다.
하위 섹션에서 각 명제에 대한 자세한 증명을 다루고 있으므로, 여기서는 간략하게 요약한다.
신장 트리 생성 증명: 알고리즘은 항상 서로 다른 두 개의 트리를 연결하는 변을 추가하므로 순환(사이클)이 생기지 않는다. 또한 모든 정점을 연결하는 변을 선택하므로, 결과 그래프는 모든 정점을 포함하는 연결된 그래프, 즉 신장 트리가 된다.
최소 비용 증명: 귀류법을 사용하여 증명한다. 크러스컬 알고리즘으로 생성된 신장 트리 가 최소 신장 트리가 아니라고 가정하고, 와 가장 많은 변을 공유하는 다른 최소 신장 트리 을 생각한다. 에는 있지만 에는 없는 변 를 고려하여, 에 를 추가하고 순환에서 다른 변 를 제거하는 방식으로 보다 와 더 많은 변을 공유하는 최소 신장 트리를 만들 수 있음을 보인다. 이는 의 선택에 모순되므로, 가 최소 신장 트리임을 알 수 있다.
이 외에도, 수학적 귀납법을 활용한 증명 방법이 존재한다.
4. 1. 신장 트리 생성 증명
크러스컬 알고리즘의 신장 트리 생성 증명은 다음 두 가지 주요 단계로 이루어진다.
1. 신장 부분 그래프 생성 증명:를 연결된 가중 그래프, 를 크러스컬 알고리즘으로 생성된 의 부분 그래프라고 하자.
따라서 는 의 신장 부분 그래프이다.
2. 최소 신장 부분 그래프 증명:을 최소 신장 부분 그래프라고 가정하자.
따라서 는 과 동일한 변과 가중치를 가지는 최소 신장 부분 그래프이다.
다른 증명 방법 (수학적 귀납법):다음 명제를 수학적 귀납법으로 증명하여 최소 비용임을 보일 수 있다.
"만약 F가 크러스컬 알고리즘의 각 단계에서 나타나는 변의 집합 중 하나라면, F를 포함하는 최소 생성 트리가 존재한다."
또 다른 증명 (수학적 강귀납법):다음 명제를 수학적 강귀납법으로 증명한다.
"알고리즘의 각 단계의 그래프는 최소 비용 생성 트리를 포함한다."
결론적으로, 크러스컬 알고리즘은 항상 최소 신장 트리를 생성한다.
4. 2. 최소 비용 증명
를 연결 가중 그래프라 하고, 를 크러스컬 알고리즘을 사용하여 생성된 의 부분 그래프라고 가정하자. 는 순환을 가질 수 없다. 마지막 변이 하나 추가되어 순환을 생성한 것이라면, 그 마지막 변은 서로 다른 나무 사이에 존재할 수 없으며, 한 부분나무 속에 존재해야만 하기 때문이다. 는 비연결 그래프일 수 없다. 내에 또 다른 연결 성분이 있었다면, 알고리즘의 절차에 의해, 그 둘을 연결하는 변이 추가되었을 것이기 때문이다. 결론적으로, 는 의 신장 부분 그래프이다.
다음으로 신장 부분 그래프 가 최소 신장 부분 그래프(minimum spanning tree)임을 보이겠다.
이 최소 신장 부분 그래프라고 가정하자. 만약 이면 도 최소 신장 부분 그래프가 된다. 이것이 사실이 아니라고 가정하자. 가 에는 있으나 에는 없는 변이라고 가정하자. 는 순환을 가질 수밖에 없다. 이 순환은 다른 하나의 변를 가지는데, 는 가 에 추가되는 알고리즘의 단계에서 고려되지 않은 변일 수밖에 없다. 그러므로 도 역시 신장 부분 그래프이다. 이 신장 부분 그래프의 총 가중치 합(total weight)은 의 총 가중치보다 작다. 왜냐하면 이므로 알고리즘이 를 방문하기 전에 를 먼저 방문했기 때문일 것이다. 만약 가중치가 같았다면, 에는 있으나 에는 없는 변 를 생각할 수 있다. 만약 남아 있는 변이 없었다면, 나 가 서로 다른 변들로 구성되어 있었더라도 의 총 가중치 합이 의 총 가중치 합과 같을 것이다. 이때도 역시 는 최소 신장 부분 그래프가 된다. 만약 의 총 가중치 합이 의 총 가중치 합보다 작은 경우에는, 이 최소 신장 부분 그래프가 아니라는 결론에 다다르게 된다. 이것은 인 변 가 있다는 처음의 가정에 위배된다. 결론적으로, 는 (과 변도 같고, 가중치도 같은) 완전한 최소 신장 부분 그래프가 될 수밖에 없다.
크러스컬 알고리즘의 결과인 신장 부분 그래프 Y의 비용이 최소임을 보이는 다른 방법은 수학적 귀납법이다. 다음 명제가 참임을 수학적 귀납법으로 증명한다.
"만약 F가 크러스컬 알고리즘의 각 단계에서 나타나는 변의 집합 중의 하나라고 하면 F를 포함하는 최소 생성나무가 있다."
이 명제를 증명하면 결국 크러스컬 알고리즘의 마지막 단계에 나타나는 생성나무 Y를 포함하는 최소 생성나무가 있고 Y가 곧 최소 생성나무이다.
# 알고리즘의 첫 단계, 즉, 변을 선택하지 않은 단계에서 F는 공집합이다. 이때, 크러스컬 알고리즘을 적용하는 그래프는 유한개의 점과 변을 가진다. 그러므로 생성나무를 유한 개 가진다. 정확성 증명의 처음에 크러스컬 알고리즘의 결과로 Y가 생성나무임을 증명했으므로 그래프가 가지는 생성나무는 하나 이상의 유한 개이다. 그러므로 최소 생성나무가 존재한다. 그러므로 공집합 F를 포함하는 최소 생성나무가 존재한다.
# 크러스컬 알고리즘의 각 단계 중에 나타나는 변의 집합 F를 포함하는 최소 생성나무 T가 있다고 가정하자.
# 알고리즘의 다음 단계에 추가하는 변을 e라 하면 다음 단계의 집합은 F에 e를 추가한 집합 이다. 를 포함하는 최소 생성나무가 존재함을 보인다. e는 T의 변이거나 아니다. (1) e가 T의 한 변이면 를 포함하는 최소 생성나무는 T이다. (2) e가 T의 변이 아니라고 하자. 그런데 T는 그래프의 모든 점을 가지는 생성나무이다. 그러므로 e는 T가 가진 두 점 A와 B를 양 끝 점으로 한다. T는 나무이므로 A에서 B로의 경로 p가 있다. 그리고 p는 유일하다. 그러므로 T에 e를 추가하면 안에 회로 C가 생긴다. 이때 에서 회로는 C 하나뿐이다. 는 크러스컬 알고리즘의 정의 때문에 회로를 가질 수 없다. 그러므로 회로 C를 가질 수 없다. 그러므로 F도 "회로 C에서 변 e가 모자란 경로 p 전체"를 가질 수 없다. 그러므로 F가 가지지 않은 "경로 p의 변 f"가 있다. f가 경로 p에 있으므로 회로 C에도 있다. 그런데 회로 C가 에서 유일한 회로이므로 f를 에서 빼면 다시 나무가 된다. 는 그래프 상의 점은 모두 가지므로 생성나무가 된다. 이제 의 비용이 최소생성나무 T의 비용 이하임을 보인다. 크러스컬 알고리즘은 매 단계에서 최소 가중치의 변을 추가한다. F는 e와 f를 가지지 않고 f의 가중치가 e 이상이기 때문에 F를 만든 단계 다음에 e를 추가한 것이다. 그러므로 의 비용은 T의 비용 이하이다. 즉, 는 최소 생성나무이다. 는 를 포함하지만 f는 F의 원소가 아니므로 는 를 포함한다. 그러므로 를 포함하는 최소 생성나무 가 존재한다.
크러스컬 알고리즘 다른 형태의 증명
나무에 관한 정리에서 n개의 꼭짓점을 가진 그래프가 연결 그래프일 때, 회로를 가지지 않는 것과 n-1개의 변을 가지는 것은 동일함이 알려져 있다. 알고리즘의 각 단계에서 얻는 그래프는 연결을 항상 유지하고 있으며 마지막 단계의 그래프는 n-1개의 변이 남으므로 회로를 가지지 않는다. 그러므로 알고리즘을 통해 얻은 그래프는 생성나무이다.
이제 남은 것은 결과로 얻은 생성나무가 최소 비용임을 보이는 것이다. 그러므로 다음과 같은 명제를 수학적 강귀납법으로 증명한다.
"알고리즘의 각 단계의 그래프는 최소비용 생성나무를 포함한다."
# 알고리즘의 최초 단계의 그래프는 변을 제거하지 않았으므로 최소비용 생성나무를 당연히 포함한다.
# 알고리즘의 처음부터 n개의 변이 남을 때까지 각 단계의 그래프가 모두 최소비용 생성나무를 포함한다고 가정한다.
# 알고리즘의 마지막 단계로 n-1개의 변이 남은 그래프인 생성나무가 최소비용 생성나무를 포함함을 보임으로써 결과로 나온 생성나무가 최소비용임을 보인다. n개의 변이 남았을 때, 그래프를 F라 하고 F가 포함하는 최소비용 생성나무를 T라고 하자. 그리고 F에서 변 e를 제거하여 알고리즘이 끝난다고 하자. T가 나무이고 회로를 가지지 않으므로 n-1개의 변을 가진다. F에서 변 f를 제거하면 T가 된다고 하자. 알고리즘에서 최대 가중치를 가진 변을 제거하므로 e의 가중치는 f 이상이다. 그러므로 F-e는 T의 비용 이하의 생성나무이다. 그런데 T는 최소비용 생성나무이므로 F-e는 T와 비용이 같다. 즉 F-e는 최소비용 생성나무이고 자신을 포함한다.
다음 명제 '''''P'''''가 귀납법에 의해 참임을 증명한다: 알고리즘의 어떤 단계에서 선택된 간선들의 집합을 ''F''라고 하면, ''F''를 포함하고 알고리즘에 의해 거부된 간선은 포함하지 않는 최소 신장 트리가 존재한다.
이 알고리즘의 정당성의 증명은 두 부분으로 나뉜다. 첫째는 신장 트리(全域木)를 생성한다는 것이고, 둘째는 그것이 최소 가중치라는 것이다.
이 증명에는 귀류법을 사용한다. 가 최소 신장 트리(최소 전역 트리)가 아니라고 가정하면, 별도로 최소 신장 트리가 하나 이상 존재한다. 그중에서, 와 공통된 변의 수가 가장 많은 트리 을 선택한다. 에 포함되고 에는 포함되지 않는 변 중에서, 본 알고리즘에 의해 에 처음으로 추가되는 변 에 대해 생각한다.
에는 사이클이 존재한다. 는 트리이므로, 사이클을 형성하는 변을 전부 포함하지는 않는다. 따라서, 이 사이클에는 에 포함되지 않는 변 ''f''가 존재한다. 도 신장 트리이므로, 그 가중치는 보다 작을 리가 없고, ''e''의 가중치는 ''f''보다 작을 리가 없다. 여기서 또 다른 귀류법을 사용하여 ''f''의 가중치가 ''e''보다 작을 리가 없음을 증명한다. 에 추가하는 변은 항상 가중치가 작은 쪽부터 선택했다. 따라서, 만약 ''f''의 가중치가 ''e''보다 작다면, ''f''는 ''e''보다 이전에 검토되었을 것이고, 부분 숲 에 추가하는지 조사했을 것이다(''e''는 에 포함되지 않는 변 중에서 에 처음으로 추가된 변이므로, 를 형성하는 과정에서 ''e''를 추가하기 전 단계의 의 부분 숲은 의 부분 숲이기도 하다). 그러나 ''f''는 에서 사이클을 형성하지 않으므로, 에서도 사이클을 형성하지 않을 것이고, 트리에 추가되었을 것이다. 이는 ''f''가 에 포함되지 않는 변이라는 것에 모순된다. 따라서, ''f''의 가중치는 ''e''보다 작을 수 없다.
이상에 의해, ''e''와 ''f''는 같은 가중치임을 나타낸다. 따라서 도 최소 신장 트리이다. 그러나 는 보다 와 공통된 변이 1개 더 많다. 이는 의 정의와 모순된다. (증명 끝)
5. 의사 코드
다음은 분리 집합 자료구조를 사용하여 구현된 크러스컬 알고리즘의 의사 코드이다.
```
'''알고리즘''' 크루스칼(''G'') '''는'''
F := ∅
'''G.V에 있는 각''' v '''에 대해'''
MAKE-SET(v)
'''가중치({u, v})에 따라 정렬된 G.E의 각''' {u, v} '''에 대해, 오름차순으로'''
'''만약''' FIND-SET(u) ≠ FIND-SET(v) '''라면'''
F := F ∪ { {u, v} }
UNION(FIND-SET(u), FIND-SET(v))
'''반환''' F
```
위 코드는 숲 ''F''를 무방향 간선 집합으로 나타내며, 두 정점이 동일한 트리에 속하는지 효율적으로 확인하기 위해 분리 집합 자료구조를 사용한다.
크러스컬 알고리즘의 절차는 다음과 같다.
- 그래프의 각 정점이 각각의 트리에 속하도록 숲(트리의 집합) ''F''를 생성한다(즉, 정점 1개만으로 구성된 트리가 정점의 개수만큼 존재한다).
- ''S'' ← 그래프의 모든 변을 포함하는 집합
- while (''S''가 공집합이 아닐 때)
- ''S''에서 가중치가 최소인 변 ''e''를 제거한다.
- if (''e''가 두 트리를 연결하는 경우)
- ''e''를 숲에 추가하고 두 트리를 하나로 합친다.
이 알고리즘이 종료되었을 때, 숲은 단일 트리가 되며, 원래 그래프의 최소 신장 트리가 된다.
6. 병렬 알고리즘
크루스칼 알고리즘은 본질적으로 순차적이어서 병렬화하기 어렵다. 그러나 가장자리(edge)의 초기 정렬을 병렬로 수행하거나, 각 반복에서 최소 가중치 가장자리를 추출하기 위해 이진 힙의 병렬 구현을 사용할 수 있다.[5]
병렬 정렬은 $O(n)$ 시간 내에 $O(\log n)$개의 프로세서에서 가능하다는 점을 고려할 때,[6] 크루스칼 알고리즘의 실행 시간은 $O(E \alpha(V))$로 줄어들 수 있다. 여기서 $\alpha$는 단일 값 아커만 함수의 역함수이다.
오시포프(Osipov) 등이 설명한 필터-크루스칼(Filter-Kruskal)이라는 크루스칼 알고리즘의 변형은 병렬화에 더 적합하다.[7] 필터-크루스칼의 기본 아이디어는 퀵 정렬과 유사한 방식으로 가장자리를 분할하고 동일한 트리의 정점을 연결하는 가장자리를 필터링하여 정렬 비용을 줄이는 것이다. 다음은 필터-크루스칼 알고리즘의 의사 코드이다.
'''function''' filter_kruskal(G) '''is'''
'''if''' |G.E| < kruskal_threshold:
'''return''' kruskal(G)
pivot = choose_random(G.E)
E, E = partition(G.E, pivot)
A = filter_kruskal(E)
E = filter(E)
A = A ∪ filter_kruskal(E)
'''return''' A
'''function''' partition(E, pivot) '''is'''
E = ∅, E = ∅
'''foreach''' (u, v) in E '''do'''
'''if''' weight(u, v) ≤ pivot '''then'''
E = E ∪ {(u, v)}
'''else'''
E = E ∪ {(u, v)}
'''return''' E, E
'''function''' filter(E) '''is'''
E = ∅
'''foreach''' (u, v) in E '''do'''
'''if''' find_set(u) ≠ find_set(v) '''then'''
E = E ∪ {(u, v)}
'''return''' E
필터-크루스칼은 정렬, 필터링 및 분할을 프로세서 간에 가장자리를 분산하여 병렬로 쉽게 수행할 수 있으므로 병렬화에 더 적합하다.[7]
마지막으로, 크루스칼 알고리즘의 병렬 구현의 다른 변형도 연구되었다. 예를 들어 백그라운드에서 최소신장트리(MST)의 일부가 아님이 확실한 가장자리를 제거하기 위해 보조 스레드를 사용하는 방식과 ''p''개의 하위 그래프에서 순차적 알고리즘을 실행한 다음 하나의 최종 MST만 남을 때까지 해당 하위 그래프를 병합하는 변형이 있다.[8][9]
참조
[1]
서적
Algorithm design
https://www.worldcat[...]
Pearson/Addison-Wesley
2006
[2]
서적
Introduction To Algorithms
https://archive.org/[...]
MIT Press
[3]
간행물
On the shortest spanning subtree of a graph and the traveling salesman problem
[4]
간행물
Formal Procedures for connecting terminals with a minimum total wire length
1957-10
[5]
간행물
Parallel graph algorithms
1984
[6]
서적
Introduction to Parallel Computing
Addison-Wesley
[7]
간행물
The filter-kruskal minimum spanning tree algorithm
2009
[8]
서적
2012 IEEE 26th International Parallel and Distributed Processing Symposium Workshops & PhD Forum
http://tarjomefa.com[...]
2012
[9]
서적
Transactions on Engineering Technologies
2014
[10]
서적
자바로 배우는 쉬운 자료구조
2013-07-30
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com