이 고밀도 버전의 Kruskal 알고리즘이 잘 알려져 있습니까?


15

약 1 년 전에 친구와 나는 밀도가 높은 그래프에 대한 Kruskal 알고리즘을 일반적인 영형(미디엄로그미디엄) 경계 보다 미리 구현하는 방법을 생각했습니다 (사전 정렬 된 가장자리를 가정하지 않음). 특히, 인접 행렬을 사용하여 구현할 때 Prim과 유사하게 모든 경우에 Θ(2) 를 달성 합니다.

C ++ 코드 및 벤치 마크를 포함하여 블로그 의 알고리즘 대해 약간 게시 했지만 일반적인 아이디어는 다음과 같습니다.

  • 연결된 각 구성 요소마다 하나의 대표 노드를 유지하십시오. 처음에는 모든 노드가 자신을 나타냅니다.

  • dist[i]모든 구성 요소 i에 대해 가장 밝은 구성 요소 교차 모서리가 입사하도록 벡터를 유지하십시오 i.

  • 파티션을 가로 지르는 가장 밝은 모서리를 찾을 때 간단히 선형 시간으로 i가중치를 최소화하십시오 dist[i].

  • 나는제이나는,케이={나는,케이,제이,케이}케이나는제이

가장 가벼운 에지의 수축 및 상기 에지의 발견은 모두 선형 시간으로 수행 될 수있다. 우리는 MST를 찾기 위해이 번을합니다. MST에 추가하려는 에지를 실제로 찾으려면 약간의 부기가 필요하지만 복잡성을 증가 시키지는 않습니다. 따라서 런타임은 입니다. 구현은 단지 두 개의 for 루프입니다.1Θ(2)

이 버전의 Kruskal은 문헌에 잘 알려져 있습니까?

답변:


19

나는 달성하기위한이 특정한 방법에 대해 잘 모르겠어요 시간 만에 크루스 칼을 수행하기위한 두 가지 방법 시간 내 종이 "빠른 계층 적 클러스터링 및 동적 가장 가까운 쌍 다른 응용 프로그램에 나와있다 "(SODA 1998, arXiv : cs.DS / 9912014 및 J. Experimental Algorithms 2000) :영형(2)영형(2)

  1. 대신 Prim–Dijkstra–Jarník을 사용한 다음 모서리를 정렬하여 Kruskal이 제공하는 삽입 순서를 얻거나

  2. Kruskal을 표준 응집 클러스터링 절차로 본 논문에 설명 된 quadtree close-pair 데이터 구조를 사용하십시오. 여기서 가장 가까운 두 클러스터를 각 단계에서 수퍼 클러스터로 병합합니다. .

솔루션 2는 사용자가 설명하는 것과 유사하지만 클러스터 간 거리를 추적하는 방법에 대한 세부 사항이 약간 다릅니다. 군집 거리 행렬의 행 단위 최소값을 유지하여이 행 최소값 목록을 선형 시간으로 스캔하여 전역 최소값을 찾을 수 있도록하면서 내 논문은 동일한 행렬에 쿼드 트리를 오버레이하고 각 행의 최소값을 추적합니다 쿼드 트리 광장. 방법은 더 단순하지만 다른 동적 근접 쌍 문제에 대해서는 유연성이 떨어집니다 (두 군집을 병합하면 다른 군집까지의 거리가 줄어들 기 때문에이 문제에 대해서는 사실이지만 반드시 다른 것은 아닙니다).

2011 년 가장 가까운 이웃 체인 알고리즘 에 대한 Wikipedia 기사에서 썼 듯이 ,이 알고리즘을 사용하여 시간 안에 Kruskal을 수행 할 수도 있습니다 . 그러나 (가장 가까운 이웃 체인 알고리즘의 다른 응용 프로그램과 달리) 공간 절약을 얻지 못하므로 쿼드 트리 방법 및 방법과 같이 공간은 여전히 입니다. 반대로 Prim + sorting은 입력을 저장하는 데 필요한 공간을 넘어 공간 만 사용할 수 있습니다 .영형(2)영형(2)영형()

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