일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 스프링
- 스프링di
- 스프링 시큐리티 설정
- kotlin 리팩터링
- 토비의 스프링
- 스프링 포매터
- 자바 필터
- Atomicity
- ioc컨테이너
- 그래프큐엘
- spring formatter
- jpa no session
- 도커 이미지 빌드
- 비기능적 요구사항
- 소프트웨어의 품격
- open-session-in-view
- kotlin ::
- java predicate
- method refetence
- Spring
- jpa lazy
- 수정자주입
- IOC
- 동적파라미터
- fetch join
- 기능적 요구사항
- 정적팩토리메서드
- 생성자주입
- 스프링시큐리티
- 스프링부트 도커
Archives
- Today
- Total
공부기록
이진 탐색(binary search) 본문
반응형
이진탐색
'정렬된 리스트'에서 특정 값을 빠르게 찾는 알고리즘.
리스트를 반으로 나눠서 목표값이 어느 쪽 절반에 속하는지 결정하고, 나머지 절반은 버리면서 목푯값이 포함될 가능성이 있는 절반을 탐색한다.
값을 찾을 때까지 이 과정을 반복한다. 어느 쪽에 속해야하는 지 결정해야하기 때문에 기본적으로 정렬된 리스트여야한다.
배열 A 에서 i < j 인 모든 i, j 인덱스 쌍에 대해
A[i] <= A[j]를 만족하면 배열 A 는 오름차순으로 정렬된 배열이다.
문제 정의
다음과 같은 오름차순으로 정렬된 배열 A 가 있다.[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
이 배열 A 에서 숫자 10을 찾아보자.
문제 해결
앞서 말한 것처럼 이진 탐색은 리스트를 반으로 나누어 탐색하기 때문에 탐색공간의 중앙값을 선택하며 시작해야한다. 이를 코드로 나타내면 다음과 같다.
var indexHigh = list.size - 1 // 탐색공간의 최대 index
var indexLow = 0 // 탐색공간의 최저 index
val indexMid = floor((indexLow + indexHigh) / 2.0).toInt() // 중앙 Index
...
이제 탐색을 시작해보자.
첫 번째 탐색
indexHigh == 9
indexLow == 0
indexMid == 4
A[4] == 5 != 10
두 번째 탐색
indexHigh == 9
indexLow == 5
indexMid == 7
A[7] == 8 != 10
세 번째 탐색
indexHigh == 9
indexLow == 8
indexMid == 8
A[8] == 9 != 10
네 번째 탐색
indexHigh == 9
indexLow == 9
indexMid == 9
A[9] == 10 == 10
네 번째 탐색 끝에 찾았다.
선형 탐색은 Index 0 부터 A.length - 1 까지 총 10번의 탐색을 해야 숫자 10을 배열 A 에서 찾을 수 있을 것이다.
이진 탐색은 4번만에 값을 찾아냈다.
구현 코드를 사용하는 클라이언트 코드
https://github.com/MorrisHong/study/blob/main/book-data-structures-the-fun-way/src/test/kotlin/binary_search/BinarySearchTest.kt
반응형
'Computer Science > 자료구조' 카테고리의 다른 글
[HashTable] JAVA로 간단히 구현해보며 HashTable을 알아보자! (1) | 2020.06.27 |
---|---|
[자료구조] 스택 (0) | 2020.05.22 |
합병정렬 (0) | 2020.01.12 |
기본적인 정렬(선택정렬, 버블정렬, 삽입정렬) (0) | 2020.01.12 |
ArrayList의 add(T t)와 addAll(Collection<? extends T> collection)을 구현해보자. (0) | 2019.10.09 |