Python의 Bisect 알고리즘 함수
그만큼 양분하다 Python의 모듈은 정렬된 목록에서 요소를 검색하는 간단하고 빠른(이진 검색 기반) 기능을 제공합니다. 새 요소를 삽입할 올바른 위치를 찾고 목록이 정렬된 상태로 유지되도록 새 요소를 삽입합니다.
Bisect 모듈이 필요한 이유는 무엇입니까?
- 정렬된 목록에서 검색하고 삽입 지점을 찾는 이진 검색 작업에 유용합니다.
- 순서를 유지하면서 정렬된 목록에 요소를 삽입하는 효율적인 방법을 제공합니다.
- 삽입할 때마다 수동으로 정렬할 필요가 없어 시간과 노력이 절약됩니다.
- 깔끔하게 최적화된 코드를 위해 bisect() bisect_left() bisect_right() 및 insort()와 같은 함수를 제공합니다.
- 리더보드 순위 데이터 유지 관리 또는 정렬된 데이터 삽입/검색과 관련된 시나리오에 이상적입니다.
Bisect 모듈의 핵심 기능
bisect 모듈은 주로 두 가지 유형의 기능을 제공합니다.
- 삽입점 찾기(삽입하지 않음)
- 올바른 위치에 요소 삽입
1. 삽입점 찾기
이 함수는 목록 정렬을 유지하기 위해 새 요소를 삽입해야 하는 인덱스를 반환합니다.
a) bisect.bisect(): 요소의 가장 오른쪽 삽입 지점을 반환합니다. 요소가 이미 존재하는 경우 삽입 지점은 기존 항목 뒤에 위치합니다.
bisect.bisect(목록 번호 구걸=0 end=len(목록))
매개변수:
- 목록: 정렬된 목록.
- 번호: 삽입할 요소입니다.
- 빌다: 검색을 위한 인덱스를 시작합니다(선택 사항).
- 끝: 검색을 위한 끝 인덱스입니다(선택 사항).
b) bisect.bisect_left(): 요소의 가장 왼쪽 삽입 지점을 반환합니다. 요소가 존재하는 경우 삽입 지점은 기존 항목 앞에 위치합니다.
bisect.bisect_left(목록 번호 구걸=0 end=len(목록))
c) bisect.bisect_right(): bisect.bisect()와 동일하며 가장 오른쪽 삽입 지점을 반환합니다.
bisect.bisect_right(목록 번호 구걸=0 end=len(목록))
예: 다양한 이등분 함수를 사용하여 정렬된 목록에서 값 4에 대한 삽입 인덱스를 찾습니다.
Python import bisect li = [ 1 3 4 4 4 6 7 ] print ( bisect . bisect ( li 4 )) # right print ( bisect . bisect_left ( li 4 )) # left print ( bisect . bisect_right ( li 4 0 4 )) # subright
산출
5 2 4
설명:
- 이등분(li 4): 목록(인덱스 4)의 마지막 4 다음에서 가장 오른쪽 위치를 찾아서 삽입 지점이 5이기 때문에 5를 반환합니다.
- bisect_left(li 4): 목록의 처음 4(인덱스 2) 이전에 가장 왼쪽 위치를 찾기 때문에 2를 반환합니다.
- bisect_right(li 4 0 4): 하위 목록에서만 작동합니다. 그거[0:4] 하위 목록의 마지막 4 뒤에 4를 삽입하기 때문에 4를 반환합니다.
2. 요소 삽입
이 함수는 정렬을 유지하기 위해 적절한 위치에 요소를 삽입합니다.
a) bisect.insort(): 가장 오른쪽 위치에 요소를 삽입합니다. bisect() 함수와 달리 이것은 실제로 요소를 삽입하여 목록을 수정합니다.
bisect.insort(목록 번호 구걸=0 end=len(목록))
매개변수:
- 목록: 정렬된 목록.
- 번호: 삽입할 요소입니다.
- 구걸하다 (선택 사항): 삽입을 위한 시작 인덱스(기본값 0)
- 끝(선택사항): 삽입을 위한 끝 인덱스(기본값 len(list)).
b) bisect.insort_left(): 가장 왼쪽 위치에 요소를 삽입합니다.
bisect.insort_left(목록 번호 구걸=0 end=len(목록))
c) bisect.insort_right(): 가장 오른쪽 위치에 요소를 삽입합니다(insort()와 유사).
bisect.insort_right(목록 번호 구걸=0 end=len(목록))
예: 다른 삽입 전략을 사용하여 정렬된 상태를 유지하면서 정렬된 목록에 값 5를 삽입합니다.
Python import bisect l1 = [ 1 3 4 4 4 6 7 ] l2 = [ 1 3 4 4 4 6 7 ] l3 = [ 1 3 4 4 4 6 7 ] bisect . insort ( l1 5 ) # right print ( l1 ) bisect . insort_left ( l2 5 ) # left print ( l2 ) bisect . insort_right ( l3 5 0 4 ) # subright print ( l3 )
산출
[1 3 4 4 4 5 6 7] [1 3 4 4 4 5 6 7] [1 3 4 4 5 4 6 7]
설명:
- 일어나다(l1 5) 가장 오른쪽의 적절한 위치(모든 4 이후 및 6 이전)에 5를 삽입합니다.
- insort_left(l2 5) 가장 왼쪽의 적합한 위치에 5를 삽입합니다. 5가 목록에 없기 때문에 여기에서는 insort와 동일합니다.
- insort_right(l3 5 0 4) 목록의 나머지 부분에는 영향을 주지 않고 해당 범위의 마지막 ≤ 5 뒤에 하위 목록 l3[0:4] = [1 3 4 4]에서만 작동하는 인덱스 4에 5를 삽입합니다.