일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Lodash
- Coveralls
- PowerMock
- RESTful
- NPM
- sinopia
- ECMAScript2015
- sanghaklee
- AWS
- 개인정보수정
- java
- {}
- python
- primitive type
- 인프런
- Unit-test
- JaCoCo
- Gitbook
- node.js
- GIT
- javascript
- nginx
- ATOM
- REST
- Travis CI
- Code-coverage
- dict
- API
- Linux
- ubuntu
Archives
- Today
- Total
이상학의 개발블로그
[학교-알고리즘] 분할 정복(Divide and Conquer) - 이진 검색과 병합 정렬(MergeSort) 본문
분할 정복(Divide and Conquer)
- step : Divide, 문제를 하나 또는 둘 이상의 인스턴스로 나눈다.
- step : Conquer, 나눠진 문제가 충분히 작고 해결가능 하다면 해결하고, 그렇지 않으면 다시 나눈다.
- step : Combine, 필요하다면, 나눠진 문제들을 다시 하나로 합친다.
이진 검색의 분할 정복
- step 0 : If x = S[mid], find x and quit
- step 1 : Divide, 배열을 두개의 하위 배열로 나눈다.
If x > S[mid], 오른쪽 배열을 선택하고 다시 찾는다.
If x < S[mid], 왼쪽 배열을 선택하고 다시 찾는다. - step 2 : Conquer, x가 어느쪽 배열에 있는지 결정한다.
이전에 이진 검색의 슈도코드를 구현했다.
이번에는 분할 정복 방식의 이진 검색을 해보겠다. 기존의 방법과 다르게 재귀적인 모양이 나타난다.
분할 정복 이진 검색 슈도코드
~~
병합 정렬의 분할 정복
- step 1 : Divide, 배열을 두개의 하위 배열로 나눈다.
- step 2 : Conquer, 각 배열이 충분히 작다면, 정렬한다. 그렇지 않으면 재귀로 다시 나눈다.
- step 3 : Combine, 나눠진 단일 배열을 합병하면서 정렬한다.
병합 정렬 슈도코드
~~
Best case time complexity of Merge
- 입력 크기 : h, m, 각 배열의 크기
- 기본 연산 : 서브 배열 U[i] 와 V[j]의 크기 비교
=> Best(h,m) = min(h,m) h 또는 m의 선형 시간, 즉 작은 배열이 기준이 되어서 비교하는 경우 가장 시간 복잡도가 좋다. 하나가 먼저 끝나는 경우
Worst case time complexity of Merge
모든 i, j 마다 비교하는 경우
ex ) U | 5, 7, ...., 100 |
V | 10, 12, .... 103 | 이런 경우 U의 100 때문에 계속 비교를 하게 된다.
=> Worst(h,m) = h+m-1 // 맨 마지막은 비교하지 않아서 -1
Worst case time complexity of MergeSort
계산해야 함. 복잡함.
이렇게 나온다
'교육 > 강의' 카테고리의 다른 글
[학교-알고리즘] 점근적 표기법과 시간 복잡도 (0) | 2016.04.14 |
---|---|
[학교-알고리즘] 알고리즘과 순차검색 이진검색 피보나치 슈도코드 (0) | 2016.04.14 |
[티아카데미] 알고리즘 기초 2 (2) | 2016.04.12 |
[티아카데미] 알고리즘 기초 (0) | 2016.04.05 |
Comments