이 글은 센트로이드 분할 알고리즘을 이해하기 전에 먼저 센트로이드를 찾는것을 알아보는 글입니다.
센트로이드를 처음 접한다면 굉장히 난해하고 이해하기 어려울 수 있습니다. 한번 개념을 잘못 이해하면 센트로이드의 정의를 이해를 하지 못할 수 있습니다. 그러므로 이 글은 센트로이드 분할을 하기에 앞서 센트로이드가 어떻게 생기는 것인지 이해하는것이 목표입니다.
센트로이드를 완전 처음 접한다면 이 글 을 읽어보거나 이 영상 을 보는것을 추천합니다. 저 글에서 알려주는 센트로이드를 증명하는 귀류법을 완벽하게 이해한다면 이 글을 읽지 않아도 괜찮습니다.
센트로이드는 트리에서의 분할정복을 위해서 고안된 알고리즘 입니다.
일반적으로 분할정복은 수열에서 이루어지는데, 시작점 start 와 끝점 end 가 있을 때, 중간점 mid = (start+end)/2 을 잡고 start 와 mid 사이 , mid 와 end 사이를 재귀적으로 탐색하면서 두 점 사이의 차가 같거나 1 일 때 특정 연산을 한 후 그 값을 토대로 넓은 범위에서 구하려는 값을 작은 범위에서 구한 값을 통해 계산해서 점진적으로 범위를 넓힌 후 전체 탐색 범위의 값을 구하는 과정입니다.
merge sort 나 segment tree 를 공부한다면 분할정복이 어떠한 상황에서 쓰이는지 쉽게 이해할 수 있습니다.
분할정복의 장점은 계속해서 절반 씩 쪼갠다는 점인데, 정점이 개가 있으면 씩 계속 탐색하여 시간복잡도가 이 됩니다.
따라서 분할정복을 통한 시간복잡도의 효과를 누리기 위해 센트로이드를 사용합니다.
분할정복을 하기 위해서는 분할되는 조각들이 이하로 줄여들어야 합니다.
수열의 길이가 10인데 , 1과 9로 나누고 , 다시 9를 1과 8로 나누면 이 아니라 과 다를바 없기 때문입니다.
수열에서는 단순히 길이의 중간값을 찾으면 되지만 트리에서는 다른 방법을 써야합니다.
트리를 아래와 같이 정의하겠습니다.
위 내용을 그림을 통해 설명하겠습니다.

위의 트리에서 임의의 정점을 선택해야 합니다. 13번 노드를 선택하고, 제거해보겠습니다.

13번 노드를 제거한다면 서브트리가 2개로 나누어집니다. 각각 크기가 12 와 2 입니다.
이 중 가장 큰 서브트리의 크기는 12 이므로 은 12 입니다.
하지만 13번 노드를 제거하는건 분할정복을 함에 있어서 적절하지 않은 선택입니다.
매번 절반씩 크기를 줄여서 만큼 줄여야 하는데 전체 크기가 15인 노드에서 절반 크기인 7보다 훨씬 큰 12인 서브트리를 탐색해야 하기 때문입니다. 즉 , 은 보다 큽니다.
따라서 이번엔 중심점인 1번 노드를 제거해보겠습니다.

1번 노드를 제거한다면 위 처럼 여러개의 서브트리들이 생겨납니다.
서브트리의 크기는 시계방향으로 1 , 3 , 3 , 7 입니다.
이러한 서브트리중 가장 크기가 큰 서브트리는 왼쪽의 서브트리이므로 은 7 이 됩니다.
이번에는 이 보다 작습니다.
따라서 정점 1번은 센트로이드입니다.
여기서 한가지 내용을 추가하겠습니다.
즉, 임의의 정점 를 제거했을때 생기는 여러개의 서브트리중 가장 큰 서브트리인 를 구했을 때 그 값이 가장 작은 정점을 구하는 것입니다. 그 정점을 라고 하겠습니다.
사실 또한 정점이기 때문에 가 가장 작은 정점 를 구한다는것과 같은 의미지만 그 정점이 특별하기 때문애 가 아니라 라고 정의하겠습니다.
그러면 2번 노드부터 15번 노드까지 를 구해보겠습니다. 1번노드는 이전에 이 7 이었습니다.

2번 노드를 제거시 는 14 입니다.

3번 노드를 제거시 는 12 입니다.

4번 노드를 제거시 는 14 입니다.

5번 노드를 제거시 는 14 입니다.

6번 노드를 제거시 는 8 입니다.

7번 노드를 제거시 는 12 입니다.

8번 노드를 제거시 는 14 입니다.

9번 노드를 제거시 는 14 입니다.

10번 노드를 제거시 는 12 입니다.

11번 노드를 제거시 는 14 입니다.

12번 노드를 제거시 는 14 입니다.

13번 노드를 제거시 는 12 입니다.

14번 노드를 제거시 는 13 입니다.

15번 노드를 제거시 는 14 입니다.
따라서 1번 정점을 선택했을 때 은 7 로써 가장 작습니다.
지금까지 를 구하고 그 값이 최소가 되는 정점을 구했습니다.
이를 한 이유는 센트로이드의 존재를 증명하기 위해서 입니다.
위 정의를 증명하기 위해 귀류법을 사용하겠습니다.
즉, 위 정의를 거짓이라고 했을 때 논리적 모순을 보임으로써 반대로 위 정의가 참일 수 밖에 없도록 만들어 보겠습니다.
귀류법을 적용하여 센트로이드가 없는 트리를 가정했을 때 위와 같은 결론에 다다르게 됩니다.
이전의 센트로이드의 정의는 아래와 같았습니다.
그리고 한가지 내용을 추가하겠습니다.
왜 가 성립할까요?
전제 조건에서 센트로이드가 없다고 가정했습니다. 그리고 가 가장 작은 정점인 를 구했을 때 생기는 가장 큰 서브트리 을 생각해봅시다.
에서 와 인접한 정점 는 의 루트 노드가 됩니다.
여기서 정점 를 제거해서 를 구한다고 생각해보겠습니다. 이 부분이 중요합니다.
를 제거한다면 와 인접한 부분과 와 인접하지 않은 부분으로 나뉩니다.
와 인접한 부분을 생각해봅시다.
은 정점 를 제거하고 생긴 서브트리중 가장 큰 서브트리이가 보다 크기 때문에 반대로 이 아닌 부분들, 즉 를 제거하고 남은 나머지 서브트리들은 보다 작습니다. 작거나 같지 않은 이유는 를 제거했기 때문에 작거나 같은 크기와 보다 큰 서브트리의 합은 이 될 수 있지만 이미 노드 하나를 뺀 상태에서 보다 작아야 하기 때문입니다.
그렇다면 와 인접하지않는 부분은 어떨까요?
정점 가 제거되면서 여러 서브트리들로 나뉘게 될것입니다. 은 루트노드가 인 트리지만 , 루트노드가 사라짐으로써 여러 서브트리가 발생하게 됩니다.
이때, 자식이 1개인경우를 생각하면 이 크기이므로 와 인접한 정점인 를 제거한다면 는 이 될것입니다.
자식이 2개이상인 경우를 생각하면 서브트리들이 더 많이 생겨나 각 서브트리들의 크기가 더 작아질것이기 때문에 는 보다 더 작은 값이 됩니다.
따라서 입니다.
하지만 위 식은 모순 됩니다.
왜냐하면 우리가 정의한 는 아래와 같기 때문입니다.
즉 보다 작은건 없습니다. 그런데 가 보다 작다고 결론이 나왔기 때문에 모순이 생긴겁니다.
여기서 알 수 있는 사실은 트리 에 센트로이드가 없다고 가정하면 모순이 생기고, 결국 트리 에는 센트로이드가 존재할 수 밖에 없다는 사실입니다.
즉 임의의 정점 를 제거했을 때 쪼개지는 서브트리의 크기가 보다 크다면 그 서브트리안에 센트로이드는 존재할 수 밖에 없습니다.
그림을 통해 정말로 그런지 확인해보겠습니다.

그림에 있었던 트리에서는 가 가장 작은 정점인 가 바로 1번 노드였습니다.
그 값은 7 이었고요.
그리고 노드, 즉 1번 노드를 제거했을때 생기는 서브트리중 가장 큰 부분은 바로 왼쪽 부분이었습니다. 즉 은 왼쪽 서브 트리를 의미하며, 1번노드가 있던 그림에서 에서 1번노드와 인접한 정점 는 바로 6번 노드가 됩니다.
그러면 6번 노드를 제거했을 때 그림을 보겠습니다.

이때 은 8이 됩니다.
따라서 입니다.
이는 그림을 통해서 식이 모순됨을 알 수 있습니다.
그리고 추가적으로 알 수 있는 사실은 가 보다 크다면 그 서브트리안에 센트로이드가 있다는 것입니다.
위 그림에서 6번을 지운 3개의 서브트리중, 오른쪽이 가장 큰 서브트리가 되며 그 서브트리안에 센트로이드 정점이 있습니다. 그 정점이 바로 1번 노드입니다.
결론적으로 우리는 트리에 센트로이드가 존재한다는 것을 증명했습니다.
이후에는 센트로이드를 통해 어떻게 분할정복을 하는지 알아보겠습니다.