[알고리즘] 이진 탐색 라이브러리

오현우·2022년 5월 10일
0

알고리즘

목록 보기
9/25
post-thumbnail

이진 탐색 라이브러리 bisect

bisect 라이브러리는 정렬된 배열에서 특정한 원소를 찾아야 할 때 매우 효과적으로 사용된다. 해당 소스 코드는 아래에서 확인이 가능하다.

https://github.com/python/cpython/blob/main/Lib/bisect.py

이진 탐색함수를 짜는 것은 어렵진 않지만 이미 개발이 되어있는 라이브러리를 쓰는 것이 시간적인 효율성과 안정성을 부여할 수 있다.

위의 탐색 라이브러리중에서 중요한 bisect_left 와 bisect_right를 설명하고자 한다.

bisect 함수 종류

bisect_left(a, x) : 정렬된 a 리스트 상태를 가정하며 정렬된 상태를 유지하면서 데이터 x를 삽입할 가장 왼쪽 인덱스를 찾는 메서드

bisect_right(a, x): 정렬된 a 리스트 상태를 가정하며 정렬된 상태를 유지하면서 데이터 x를 삽입할 가장 오른쪽 인덱스를 찾는 메서드

파이썬 코드로 위의 내용을 구현하면 아래와 같다.

from bisect import bisect_left, bisect_right

a = [1, 2, 3, 3, 3, 5, 5, 7]
x = 3

print(bisect_left(a, x))
print(bisect_right(a, x))

bisect 라이브러리를 활용한 잡기술

정렬된 리스트에서 값이 특정 범위에 속하는 원소의 갯수를 구할 때 효과적으로 사용할 수 있다.

from bisect import bisect_left, bisect_right

# 값이[left_value, right_value]에 포함되는 데이터의 개수를 반환하는 함수

def count_range(list: list[int], left_value: int, right_value: int) -> int:
    left_index = bisect_left(list, left_value)
    right_index = bisect_right(list, right_value)

    return right_index - left_index
profile
핵심은 같게, 생각은 다르게

0개의 댓글