📙
Daeun's devlogs
  • First page
  • Docker
    • 이미지, 레이어
    • 컨테이너 생성하기
    • Dockerfile로 이미지 생성하기
    • 이미지를 dockerhub repo에 push하기
  • Python
  • Algorithm Study
  • 방향없는 그래프(undirected graph)
  • 방향있는 그래프(directed graph)
  • 위상 정렬(topological sort)
  • BFS(Breadth-First Search)
  • 다익스트라(Dijkstra)
  • 벨만-포드(Bellman-Ford) 알고리즘
  • 최소신장트리(Minimum Spanning Tree)
  • 크루스칼(Kruskal) 알고리즘
  • Algorithm quiz
    • quizzes & solutions
    • graph에서 cycle 유무 확인하기
    • bipartite(이분그래프) 확인하기
    • Dijkstra 알고리즘으로 모든 정점으로의 최단 경로 구하기
  • operating system
  • 스루풋 & 레이턴시
  • Cloud Computing
    • cloud computing 의 종류
    • CloudFormation으로 EC2 & ElasticIP 생성하기
  • Network
    • DataLink 계층
    • Network 계층
    • subnetting & CIDR
    • Domain Name System
    • Transport 계층
  • Unix
    • dig 커맨드로 DNS서버에 질의하기
    • APT(Advanced Package Tool)로 젠킨스 설치하기
    • usermod 로 그룹에 유저 추가하기
    • sysctl 로 커널 변수 조회하기
  • Django
    • 마이그레이션 실행여부 확인하기
    • 마이그레이션 DDL 쿼리 확인하기
  • Kubernetes
  • 쿠버네티스(Kubernetes) 개념
  • k8s 클러스터에 애플리케이션 서버 실행하기
  • kops로 AWS에 k8s 클러스터 생성하기
  • k8s 클러스터에 replicaset 생성하기
  • Nginx & WSGI pod를 service로 노출하기
  • Helm으로 쿠버네티스 리소스 배포하기
Powered by GitBook
On this page

Was this helpful?

크루스칼(Kruskal) 알고리즘

Previous최소신장트리(Minimum Spanning Tree)Nextquizzes & solutions

Last updated 5 years ago

Was this helpful?

최초작성일 [2020.01.29]

크루스칼(Kruskal) 알고리즘은 그래프에서 를 찾는 데 쓰이는 알고리즘이다.

  1. 각 정점을 독립된 component으로 간주한다.

  2. 탐색하지 않은 간선들 중에 가중치가 가장 작은 간선 e로 연결된 두 정점 v1, v2가 같은 에 있는지 확인한다.

  3. 같은 connected component에 있지 않으면 e를 집합 X에 추가하고 v1, v2를 같은 disjoint set으로 묶는다.

  4. 같은 connected component에 있으면 e는 사이클을 만드는 간선이므로 X에 추가하지 않는다.

  5. 모든 정점이 1개의 disjoint set으로 묶일 때까지 2 ~ 4 를 반복한다.

의사코드는 아래와 같다.

def kruskal(G):
  X = set()

  for each v in V:
    make_set(v)
  
  E = sort_E_by_weight(E)  # 1
 
  for each (v1, v2) in E:
    if find(v1) != find(v2):  # 2
      X.add((v1, v2))
      union(v1, v2)  # 3
  
  return X

시간복잡도

시간복잡도를 계산하기 위해 의사코드에서 매긴 번호로 로직을 분류한다.

  1. 간선을 정렬하는 데 걸리는 시간복잡도는 퀵정렬을 사용한다면 O(|E|log|E|) 이다.

  2. 각 간선을 순회하면서 find()를 2번 실행하므로 O(log|V|)이다. (트리형태의 disjoint set에서 어떤 노드의 루트를 찾는 데 걸리는 시간복잡도는 O(log|V|)이기 때문.)

  3. union()은 heuristic rank를 적용하면 O(1)이다. (find()를 호출하면서 v1, v2의 루트가 이미 갱신되었기 때문.)

따라서 |E| * log|E| + |E|(log|V| + 1) = |E| * (log|E| + log|V|) 가 된다. 그런데 최신장트리는 모든 정점이 연결되어야 함을 가정하므로 그래프 내 간선의 갯수는 적어도 |V| - 1 개 이상이다. 따라서 크루스칼 알고리즘의 시간복잡도는 최종적으로

|E| * (log|E| + log(|E|+1)} = O(|E|log|E|) 가 된다.

최소신장트리(Minimum Spanning Tree)
connected component