Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 알고리즘
- error
- 공부
- Algorithm
- SwiftUI
- Level 1
- 파이썬
- 프로그래머스
- Clean Architecture
- 알고리즘 공부
- ios
- 오토레이아웃
- Swift공부
- UIKit
- 안드로이드 공부
- dfs
- swift
- 앱개발
- 파이썬 풀이
- iOS개발
- 백준 온라인 저지
- Autolayout
- greedy algorithm
- Python
- BFS
- 정렬
- 백준온라인저지
- 그리디 알고리즘
- Kotlin
- Android
Archives
- Today
- Total
Tori의 개발 공부
이분 탐색 정리 본문
이분 탐색
이분 탐색이란?
정렬되어 있는 배열에서 탐색을 할 때, 탐색 범위를 반씩 나누어 탐색하는 방법
장단점
- 장점 : 하나하나 살펴보는 기존 탐색에 비해 훨씬 빠르다.
- 단점 : 정렬이 된 상태에서만 사용할 수 있어 사용하기 까다롭다.
이분 탐색 방법
- 데이터 배열을 정렬해준다.
- 정렬된 배열에서 왼쪽 끝 인덱스 : left, 오른쪽 끝 인덱스 : right를 이용해 중앙값 : mid를 찾는다.
- mid와 배열에서 찾고자 하는 값(target)을 비교한다.
- target이 나올 때까지 아래와 같은 탐색 과정을 반복한다
- mid < target : left를 mid + 1로 이동시켜 오른쪽 구간 탐색(mid+1 ~ right)
- mid > target : right를 mid-1로 이동시켜 왼쪽 구간 탐색 (left ~ mid-1)
- target이 없으면 none을 반환한다.
이분 탐색은 정렬된 데이터 안에서 반씩 나누어 접근하면서 target이 더 크면 큰 수가 있는 분할 배열로, 작으면 작은 수가 있는 분할 배열로 다시 탐색하는 방법이다.
이는 데이터가 정렬되어 있어 오른쪽은 mid보다 더 큰 수가 있고 왼쪽은 mid보다 더 작은 수가 있음을 보장하기 때문에 가능한 방법이다.
이분 탐색 구현 (파이썬)
이분 탐색은 재귀와 반복을 통해 구현할 수 있다.
재귀를 이용한 구현
def binary_search(arr, target, left, right) :
if left > right :
return -1
mid = (left+right)/2
if arr[mid] == target:
return arr[mid]
elif arr[mid] > target :
return recursion_binary_search(arr, target, left, mid-1)
else :
return recursion_binary_search(arr, target, mid+1, right)
반복을 이용한 구현
def binary_search(arr, target):
left = 0
right = len(arr) -1
while left<=right :
mid = (left + right) / 2
if arr[mid] == target :
return arr[mid]
elif arr[mid] > target :
right = mid -1
else :
left = mid + 1
return -1
시간 복잡도
처음 시행에 반이 버려지면 -> N/2
그다음 두 번째 시행에 반이 버려지면 -> (N/2) / 2
세 번째 시행에 또 반이 버려지면 -> ((N/2)/2) / 2
...
K번째 실행에는 아래와 같이 나타낼 수 있다.
N/(2^k)
위와 같이 시행했을 때 남은 자료는 한 개이므로 N/(2^k) = 1
시행 횟수인 k에 대해 정리하면 k = log2(N)이다.
따라서 시간 복잡도는 O(logN)이다.
'Algorithm > 개념 정리' 카테고리의 다른 글
[알고리즘 / Swift] 힙 Heap (0) | 2024.03.13 |
---|---|
트리와 그래프 내용 정리 (0) | 2021.12.05 |
그리디 알고리즘 내용 정리 (0) | 2021.11.23 |
분할과 정복 내용정리 (0) | 2021.09.13 |
재귀 알고리즘 내용 정리 (0) | 2021.09.06 |