속도 < 방향
[CS50] 합병 정렬, 이진 탐색 본문
edwith CS50강의를 보며 정리했습니다.
합병정렬
합병정렬은 원소가 한개가 될 때까지 계속 반으로 나누다가 다시 합쳐나가며 정렬을 하는 방식이다.
합병 정렬은 버블 정렬, 선택 정렬, 삽입 정렬보다 훨씬 빠르고 간결하고 깔끔하게 표현할 수 있다.
합병정렬의 시간복잡도 상한선은 $nlogn$이다. 다른 정렬의 최소 상한선은 $n^2$이고, 이는 $nlogn$보다 크다. 합병정렬은 시간적으로 빠르지만 단점도 존재한다.
합병 정렬은 더 많은 공간(메모리)을 사용한다.
8개의 자료가 있다고 하면, 세 번을 나눈다. $log28$은 3이다. 그리고 그 한번을 실행할 때마다 자료를 n번씩 봐야했기 때문에 $nlogn$으로 표현할 수 있다. 합병 정렬은 병합하는 알고리즘을 포함한다.
실행시간으로 표현을 한다면, $T(n) = T(\frac{n}{2}) + T(\frac{n}{2}) + O(n) $ 이 될 수 있다. 각 $ T(\frac{n}{2}) $는 왼쪽과 오른쪽 절반에 해당하고, $O(n)$ 은 자료를 비교하는 n 단계를 나타낸다.
이진탐색
전화번호부 예시처럼 봐야하는 데이터의 목록이 점점 작아지도록 계속해서 절반으로 나누는 알고리즘의 시간복잡도는 $logn$이다. $logn$에서 실행하는 알고리즘의 세부 조건은 알고리즘 입력 목록이 정렬되는 것을 가정해야 한다.
이진 탐색을 일반적으로 선형 탐색보다 속도가 빠르지만, 배열을 정리하는 시간이 추가되기도 한다.
'개발 > Computer Science' 카테고리의 다른 글
[CS50] 알고리즘 기초 : 시간 복잡도 (0) | 2022.06.18 |
---|---|
[CS50] 알고리즘 기초 : 탐색, 정렬, 시간 복잡도 (0) | 2022.06.02 |
[CS50] 알고리즘 (0) | 2022.04.09 |
[CS50] 인공지능 (0) | 2022.04.09 |
[CS50] 현실보다 더 생생한 세상 (0) | 2022.03.28 |