| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- java
- 일급 객체
- Google OAuth
- Dependency Injection
- spring security
- Spring
- factory
- OAuth 2.0
- 일급 컬렉션
- builder
- synchronized
- Volatile
- lombok
- Today
- Total
HJW's IT Blog
Algorithm: Binary Search 본문
Binary Search 란 정렬된 배열에서 원하는 값을 빠르게 찾기 위한 알고리즘이다
Binary Search는 반으로 나누어 검색하는 방법으로 시간 복잡도는 O(log n) 이다.
동작과정
1. 배열의 중간값을 선택한다
2. 중간값과 찾고자 하는 값을 비교
--> 중간값이 찾고자 하는 값과 같으면 검색을 종료
--> 찾고자 하는 값이 중간값보다 작으면 배열의 왼쪽으로 다시검색
--> 찾고자 하는 값이 중간값보다 크다면 배열의 오른쪽으로 다시 검색
--> 위 방법 반복
경비실 문제

무식한 방법
M이 가장 왼쪽에 있는 집부터 가장 오른쪽에 있는 집까지의 거리.
모든 (M,k) 에 대해 다 조합해본다: O(M^k) 시간
착안점
--> 경비실이 k개 있다면 집에서 경비실 까지의 거리는 M/(2k) 보다 멀 수 없다.
--> 경비실을 하나 더 놓는다면 최대 거리는 확실히 줄어든다
다른 방법(이진 탐색)
--> 집들을 x 좌표 기준으로 정렬
--> 맨 왼쪽 집부터 오른쪽까지 읽어나가며, k개의 경비실을 놓아서 가장 먼 집까지의 거리가 d가 되는지 점검.
--> 맨 왼쪽 집을 생각해보자
--> 경비실은 이 집의 좌표에서 d 만큼 오른쪽에 떨어진 곳에 있을 것.
--> 이 경비실로부터 거리가 d 이내인 집을 모두 제거한 다음, 남은 집에 대해 똑같은 과정을 반목하면 필요한 경 비실의 수
--> 만약 필요한 경비실의 수가 k 이하라면, d 값을 줄여서 답이 되는지 점검
--> 만약 필요한 경비실의 수가 k 초과라면, d 값을 더 키워야 한다
Heron's Method
- sqrt(2) 의 값은?
- 1은 확실히 아니다. 2도 아니다.
- 그렇다면 (1+2/1)/2 = 3/2 도 답이 아니지만 위보다 근접
- 그렇다면, (3/2+2/(3/2))/2 = 17/12 는 위보다도 더 근접
- x < sqrt(2) 라면 2/x > sqrt(2) 이므로 (x + 2/x) / 2 는 x, 2/x 보다 훨씬 sqrt(2) 에 가깝다
'알고리즘' 카테고리의 다른 글
| Algorithm: Network Flow (0) | 2023.05.22 |
|---|---|
| Algorithm: Kruskal Algorithm & Binary Search (0) | 2023.04.17 |
| Algorithm: Segment Tree (0) | 2023.04.14 |
| Algorithm: 욕심쟁이 기법 (0) | 2023.04.14 |
| Algorithm: 과반수 찾기 (0) | 2023.04.14 |