728x90
[파이썬] 이진 탐색 라이브러리 bisect
bisect
이진 탐색 알고리즘을 쉽게 구현할 수 있도록 도와주는 라이브러리.
원소들이 정렬된 리스트에서 특정 원소를 찾을 때 유용하다.
bisect_left(list, data) : 리스트가 정렬 상태를 유지하면서, data가 list에 몇 번 인덱스로 들어갈지를 반환(가장 왼쪽)
bisect_right(list, data) : 리스트가 정렬 상태를 유지하면서, data가 list에 몇 번 인덱스로 들어갈지를 반환(가장 오른쪽)
from bisect import bisect_left, bisect_right
lst = [1, 3, 4, 5]
print(bisect_left(lst, 3))
print(bisect_right(lst, 3))
1
2
lst는 정렬 상태이다. 이때 3을 추가로 삽입하려고 할 경우,
lst의 정렬 상태를 유지하면서 3을 넣기 위해서는 lst의 1번 인덱스에 위치한 3을 기준으로 왼쪽 또는 오른쪽을 선택할 수 있다.
원래 상태
lst = [1, 3, 4, 5]
0번 : 1
1번 : 3
2번 : 4
3번 : 5
bisect_left(lst, 3)의 경우 -> 1 반환
lst = [1, 3, 3, 4, 5]
0번 : 1
1번 : 3
2번 : 3
3번 : 4
4번 : 5
bisect_right(lst, 3)의 경우 -> 2 반환
lst = [1, 3, 3, 4, 5]
0번 : 1
1번 : 3
2번 : 3
3번 : 4
4번 : 5
그냥 코드로 이진 탐색을 구현할 경우 시간 복잡도는 O(logN)이지만, 이 두 함수를 이용할 경우 그 보다 더 빨리 계산할 수 있다는 장점이 있다.
이진 탐색으로 리스트 내의 특정 값의 개수 구하기
from bisect import bisect_left, bisect_right
lst = [1, 2, 2, 2, 3, 4, 5]
left_idx = bisect_left(lst, 2)
right_idx = bisect_right(lst, 2)
print(right_idx - left_idx)
3
left_idx = 1
right_idx = 4 가 된다.
이 둘의 차를 이용해 lst에서 3이 몇 개나 들어 있는지를 빠르게 구할 수 있다.
728x90
'파이썬' 카테고리의 다른 글
[파이썬] 딕셔너리(Dictionary) 자료형 정리 (0) | 2022.02.23 |
---|---|
[python] 정렬 함수 sort(), sorted() (0) | 2022.01.28 |
[python] 입력 받기 : input()과 sys.stdin.readline() (0) | 2022.01.23 |