이 글은 개인의 학습을 목적으로 정리한 글입니다. 이점 참고하고 읽어주세요;)
Quick-Find는 위와 같이 하나의 배열이 존재할 때, 그 배열의 인덱스에 저장된 값들을 다른 인덱스에 저장된 값들과 연결시키고(union), 또 연결되었는지 확인하는(connected) 알고리즘의 한 유형입니다. 그 구조를 도식화한 것이 위의 그림입니다.
Union의 기본 구조는 위와 같습니다. union()에 두 인덱스 값을 줬을 때, 앞의 인덱스에 저장된 값을 뒤의 인덱스에 저장된 값으로 변경하는 방식입니다.
public class QuickFind {
private int[] id;
public QuickFind(int N){
id = new int[N];
for(int i=0; i<N; i++)
id[i] = i;
}
public boolean conneced(int p, int q){
return id[p] == id[q]; // 같으면 true, 다르면 fale
}
public void union(int p, int q){ // N^2의 연산 시간 발생(quadratic time).
int pid = id[p];
int qid = id[q];
for(int i=0; i<id.length; i++){
if(id[i]==pid) id[i]=qid;
}
}
public static void main(String[] args){
QuickFind quickf = new QuickFind(10);
System.out.println(quickf.conneced(1, 5));
quickf.union(1,5);
System.out.println(quickf.conneced(1,5));
}
}
이를 코드로 구현해보면 위와 같습니다.
그런데 이러한 QuickFind 알고리즘에서 union 연산은 for문을 통해 배열 전체를 훑는 연산을 실행하게 됩니다. 때문에 크기가 N개인 배열에 대해 N번의 union을 진행한다면 N^2번, 즉 N의 제곱만큼의 연산을 요하게 됩니다. 이런 제곱 연산은 처리해야 하는 데이터의 크기가 늘어날수록 필요로 하는 시간이 기하급수적으로 증가하기 때문에 시간적인 측면에서 그리 효율적인 방법은 아닙니다. 이러한 연산에 대해 너무 비싸다. 즉 too expensive 하다고 말합니다.
'Information Technology > Algorithms' 카테고리의 다른 글
[JAVA] Recursion 설계 (0) | 2020.01.10 |
---|---|
[JAVA] Recursion의 개념과 기본 예제 (0) | 2020.01.10 |
점근적 표기법 (0) | 2020.01.07 |
[JAVA] Quick Union Improvements (0) | 2020.01.07 |
[JAVA] Quick Union (0) | 2020.01.06 |