21-02-18 알고리즘 기초강의
이분검색(Binary search)
- 정렬되지 않은 리스트에서 주어진 키가 존재하는가? - 순차 탐색
- 정렬된 리스트에서 주어진 키가 존재하는가? - 이분 검색
- 이분검색의 알고리즘 설계방식: 분할정복(Divide-and-Conquer)
:point_right: 정렬된 리스트 S에 어떤 키 x가 존재하는가? :point_right: 존재하면 S에서 x의 위치, 아니면 -1을 리턴
S의 정가운데 원소와 x를 비교하여 같으면 해당 위치를 리턴 아니라면,
Divide: 정 가운데 원소를 기준으로 S를 두개의 리스트로 분할
Conquer: x가 정가운데 원소보다 크면 오른쪽, 작으면 왼쪽을 재귀 호출
Obtain: 선택한 리스트에서 얻은 답을 리턴
파이썬으로 이분검색
1 | def location (S, low, high): |
자바스크립트로 이분검색
1 | function location(arr, low = 0, high = arr.length) { |
강의 내에서 x값은 전역변수를 사용하였음
합병정렬
- 합병정렬의 알고리즘 설계방식: 분할정복(Divide-and-Conquer)
Divide: 원소가 n개인 S를 n/2개의 원소를 가진 두 개의 리스트로 분할
Conquer: 왼쪽의 리스트와 오른쪽의 리스트를 각각 재귀적으로 합병정렬
Obtain: 각각 정렬된 두 개의 리스트를 정렬된 하나의 리스트로 합병하여 리턴
합병정렬 예시
파이썬으로 합병정렬
1 | def mergesort (S): |
자바스크립트로 합병정렬
1 | function mergesort (arr) { |
- 합병정렬의 문제점
- 배열을 추가적으로 사용하게 됨 → 메모리 사용의 비효율성
합병정렬의 효율화
1 | def mergesort2 (S, low, high): |
자바스크립트로 합병정렬 조금 더 생각해보기
1 | // 파이썬처럼 배열을 덜 정의하면서 효율적으로 구현하는 법은 더 검색해볼 것 |