Graph | Tree | |
---|---|---|
방향성 | 방향 그래프 혹은 무방향 | 방향 그래프 |
순환성 | 순환 혹은 비순환 | 비순환 |
루트 노드 존재 여부 | 루트 노드 없읍 | 루트 노드 존재 |
노드간 관계성 | 부모와 자식 관계가 없음 | 부모와 자식 관계 |
모델의 종류 | 네크워크 모델 | 계층 모델 |
Memory space | Time | |
---|---|---|
인접 행렬 | O(V2) | O(1) |
인접 리스트 | O(E) | O(V) |
private static void union(int a, int b){
a=find(a);
b=find(b);
if(a<b) parent[b]=a;
else parent[a]=b;
}
[비대칭 트리구조]
private static int find(int x){
if(x==parent[x]) return x; // 자기 자신의 루트 노드 라는 의미
return find(parent[x]);
}
비대칭 트리구조 형태일 경우 연결 리스트 형태로 구성되어 배열로 구현하는 방식보다 시간 복잡도가 O(N) 이 되어 비효율적인 구성이 된다.
시간 복잡도를 개선하기위해서는 리스트 형태의 트리 구조를 경로압축 과정을 통해 시간복잡도가 O(lonN) 인 균형있는 트리 구조로 개선해야한다.
[대칭 트리구조]
private static int find(int x){
if(x==parent[x]) return x; // 자기 자신의 루트 노드 라는 의미
return parent[x]=find(parent[x]);
}
boolean cycle = false;
for(int i=1; i<=e; i++){
int a= sc.nextInt();
int b = sc.nextInt();
if(find(a)==find(b)){
cycle = true;
break;
}
else
union(a,b);
}
크루스칼 알고리즘은 신장트리 자료구조를 기반으로 하며 작은 비용으로 모든 노트를 순회를 목적으로 한다. 이때 시간 복잡도는 O(ElogE) 이다.
( 신장트리 : 하나의 크래프가 존재할 때 모든 노드를 포함하면서 사이클이 존재하지 않는 그래프)