본문 바로가기

알고리즘 & 확률/Sort & Selection

(2)
선형 시간에 중간값 구하기 (Quick-Select & Median-of-Medians) 이번 포스트에서 함께 공부할 내용은 중간값(median)을 구하는 방법입니다. 중간값은 어떤 수열을 오름차순으로 정렬했을 때 가운데에 위치한 수를 의미합니다. 예를 들어, 수열이 \[ 4, 8, 3, 1, 6 \]으로 주어졌을 때, 이를 오름차순으로 정렬하면 \[ 1, 3, 4, 6, 8 \]이 되고, 여기서 중간값은 \(4\)가 되겠습니다. 만약 수열의 길이가 짝수라면 중간에 위치한 수는 두 개가 됩니다. 이 글에서는 크기가 다르다면 둘 중 크기가 더 작은 값을 중간값으로 정의하겠습니다. 중간값을 구하는 가장 간단한 방법은 수열을 먼저 정렬한 후에 가운데에 위치한 수를 찾는 것입니다. (비교 기반) 정렬 알고리즘은 수열의 길이 \(n\)에 대해 \( \Theta(n \log n) \)에 수행된다는 사실..
확률 퀵 정렬 분석 (Analysis on Randomized Quick-Sort) 요즘 백준 온라인 저지에서 문제를 하나씩 풀고 있습니다. 재밌더군요. 좀더 어릴 때부터 이를 해왔다면 더 좋지 않았을까 생각합니다. 주위에 문제 해결 분야를 열심히 연습하는 친구들이 많이 있는데, 그 친구들이 생각하는 건 확실히 남다른 것 같더라고요. 저도 그런 실력을 갖췄다면 어땠을까 생각하며 부러워하기도 합니다. 여튼 지금부터라도 한다면 도움이 되지 않을까요? 아무튼 백준 문제를 풀다 보니 정렬 알고리즘을 사용해야할 때가 자주 있었습니다. 그리고 그때마다 저 나름대로 퀵 정렬(quick-sort)을 구현해왔습니다.(의 std::sort()가 그렇게 좋다는 사실은 최근에야 알게 되었습니다. 지금은 직접 안 짭니다. 하하.) 그러다 문득 퀵 정렬의 시간 복잡도 분석이 궁금해졌습니다. 대학생 때 퀵 정렬이..