pyhon的bisect模塊(二分查找與插入)

bisect.bisect_left(a, x, lo=0, hi=len(a))
  • 找到a中第一個不小於x(大於等於x)的元素的下標
def bisect_left(a, x, lo=0, hi=None):
    """Return the index where to insert item x in list a, assuming a is sorted.

    The return value i is such that all e in a[:i] have e < x, and all e in
    a[i:] have e >= x.  So if x already appears in the list, a.insert(x) will
    insert just before the leftmost x already there.

    Optional args lo (default 0) and hi (default len(a)) bound the
    slice of a to be searched.
    """

    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
bisect.bisect_right(a, x, lo=0, hi=len(a))
  • 找到a中第一個大於x的元素的下標
def bisect_right(a, x, lo=0, hi=None):
    """Return the index where to insert item x in list a, assuming a is sorted.

    The return value i is such that all e in a[:i] have e <= x, and all e in
    a[i:] have e > x.  So if x already appears in the list, a.insert(x) will
    insert just after the rightmost x already there.

    Optional args lo (default 0) and hi (default len(a)) bound the
    slice of a to be searched.
    """

    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 x < a[mid]: hi = mid
        else: lo = mid+1
    return lo
bisect.bisect(a, x, lo=0, hi=len(a))
  • 等價於bisect.bisect_right(a, x, lo=0, hi=len(a))
bisect.insort_left(a, x, lo=0, hi=len(a))
  • 找到a中第一個不小於x(大於等於x)的元素的下標,然後將x插入到這個位置
def insort_left(a, x, lo=0, hi=None):
    """Insert item x in list a, and keep it sorted assuming a is sorted.

    If x is already in a, insert it to the left of the leftmost x.

    Optional args lo (default 0) and hi (default len(a)) bound the
    slice of a to be searched.
    """

    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
    a.insert(lo, x)
bisect.insort_right(a, x, lo=0, hi=len(a))
  • 找到a中第一個大於x的元素的下標,然後將x插入到這個位置
def insort_right(a, x, lo=0, hi=None):
   """Insert item x in list a, and keep it sorted assuming a is sorted.

   If x is already in a, insert it to the right of the rightmost x.

   Optional args lo (default 0) and hi (default len(a)) bound the
   slice of a to be searched.
   """

   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 x < a[mid]: hi = mid
       else: lo = mid+1
   a.insert(lo, x)
bisect.insort(a, x, lo=0, hi=len(a))
  • 等價於bisect.insort_right(a, x, lo=0, hi=len(a))
舉例如下
import bisect

alist = [5, 5, 9, 9, 14, 14, 16, 16, 19, 19]
print(bisect.bisect_left(alist, 9)) #2
print(bisect.bisect_right(alist, 9)) #4 
print(bisect.bisect(alist, 9)) #4
print(bisect.bisect_left(alist,20)) #10
print(bisect.bisect_right(alist,20)) #10
print(bisect.bisect_left(alist, 5)) #0
print(bisect.bisect_right(alist, 5))#2


#對於插入來說,插入的位置可能會不同,但最終得到的結果都是一樣的
alist = [5, 5, 9, 9, 14, 14, 16, 16, 19, 19]
bisect.insort_left(alist,5)
print(alist) #[5, 5, 5, 9, 9, 14, 14, 16, 16, 19, 19]

alist = [5, 5, 9, 9, 14, 14, 16, 16, 19, 19]
bisect.insort_right(alist,5)
print(alist) #[5, 5, 5, 9, 9, 14, 14, 16, 16, 19, 19]


參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章