Python bisect
알고리즘 문제를 풀다 보면 이진 탐색을 써야할 경우가 존재한다.
이러한 문제를 풀 때 마다 이진 탐색 알고리즘을 작성하는 것은 다소 효율적이지 못하다.
이번에는 Python의 이진 탐색 모듈,
bisect
에 대해 알아보도록 한다.
일반적 이진탐색
다른 언어 또는 파이썬을 이용하여도 이 기능을 모르는 경우에는 이진탐색 함수를 직접 작성한다.
def bisect(a, x, lo=0, hi=None): if lo < 0: raise ValueError('lo must be non-negative') if hi is None: hi = len(a) while lo < hi: mid = (lo + hi) // 2 if a[mid] < x: lo = mid + 1 else: hi = mid return lo mylist = [1, 2, 3, 7, 9, 11, 33] print(bisect(mylist, 3))
파이썬의 bisect
import bisect mylist = [1, 2, 3, 7, 9, 11, 33] print(bisect.bisect(mylist, 3))
파이썬에서는
bisect.bisect
메소드를 사용하면 이 코드를 위와 같이 간략하게 작성할 수 있다.
bisect.bisect(a, x, lo=0, hi=len(a))
bisect()
는a
라는 오름차순으로 정렬된 시퀀스에x
값이 들어갈 위치를 리턴한다.import bisect sequence = [1, 3, 4, 5] print(bisect.bisect(sequence, 2)) #1
lo
와hi
를 통해 검색하는 시퀀스의 영역을 제어할 수 있다.
default
로는 시퀀스 전체를 범위로 한다.
bisect()
는bisect_right()
와 동일하며bisect_left()
함수도 제공한다.두 함수의 차이는
x
와 동일한 값이 시퀀스a
에 존재할 때 다른 값을 반환한다.
bisect_right()
는x
와 동일한 값이 시퀀스a
에 존재할 경우,x
와 동일한 값의 뒤 위치를 리턴한다.
bisect_left()
는x
와 동일한 값 위치를 리턴한다.import bisect sequence = [1, 3, 4, 5] print(bisect.bisect_left(sequence, 3)) print(bisect.bisect_right(seuqnece, 3)) # 1 # 2
bisect.insort(a, x, lo=0, hi=len(a))
insort()
는a
라는 오름차순 정렬 시퀀스에x
값을 삽입한다.import bisect sequence = [1, 3, 4, 5] bisect.insort(sequence, 2) print(sequence) # [1, 2, 3, 4, 5]
bisect()
와 마찬가지로lo
와hi
를 통해 검색하는 시퀀스의 영역을 제어할 수 있다.
default
로 시퀀스 전체를 범위로 한다.
insort()
는insort_right()
와 같으며insort_left()
가 존재한다.
insort_right()
는x
와 동일한 값이 시퀀스a
에 존재할 때,x
와 동일한 값 바로 뒤에x
를 삽입한다.
insort_left()
는x
와 동일한 값이 시퀀스a
에 존재할 때,x
와 동일한 값 위치에x
를 삽입한다.
'Programming > Python' 카테고리의 다른 글
[Python] 선택 정렬, 거품 정렬, 삽입 정렬, 퀵 정렬, 병합 정렬 (0) | 2020.05.22 |
---|---|
[Python] BFS & DFS (0) | 2020.04.15 |
DFS Concept & Implementation (0) | 2019.10.21 |
BFS Concept & Implementation (0) | 2019.10.21 |
BFS&DFS (0) | 2019.10.21 |