Python의 Bisect 알고리즘 함수

그만큼 양분하다 Python의 모듈은 정렬된 목록에서 요소를 검색하는 간단하고 빠른(이진 검색 기반) 기능을 제공합니다. 새 요소를 삽입할 올바른 위치를 찾고 목록이 정렬된 상태로 유지되도록 새 요소를 삽입합니다.

Bisect 모듈이 필요한 이유는 무엇입니까?

  1. 정렬된 목록에서 검색하고 삽입 지점을 찾는 이진 검색 작업에 유용합니다.
  2. 순서를 유지하면서 정렬된 목록에 요소를 삽입하는 효율적인 방법을 제공합니다.
  3. 삽입할 때마다 수동으로 정렬할 필요가 없어 시간과 노력이 절약됩니다.
  4. 깔끔하게 최적화된 코드를 위해 bisect() bisect_left() bisect_right() 및 insort()와 같은 함수를 제공합니다.
  5. 리더보드 순위 데이터 유지 관리 또는 정렬된 데이터 삽입/검색과 관련된 시나리오에 이상적입니다.

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를 삽입합니다.