您好,登錄后才能下訂單哦!
本篇內容主要講解“Python二分查找之bisect庫如何使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Python二分查找之bisect庫如何使用”吧!
bisect
庫是 Python 標準庫中的一部分,它提供了二分查找的功能。二分查找是一種在有序列表中查找某一特定元素的搜索算法。它的時間復雜度為 O ( log ? n ) O(\log n) O(logn),比順序查找的時間復雜度 O ( n ) O(n) O(n) 要有效率。
bisect
庫提供了 bisect_left
、bisect_right
、insort_left
、insort_right
四個函數,用于在有序列表中查找或插入元素。
bisect_left
函數用于在有序列表中二分查找某一位置,使得在該位置插入指定元素后仍保持有序,返回該位置,如果元素已經存在,則返回它的左邊位置。
函數原型如下:
bisect.bisect_left(a, x, lo=0, hi=len(a), *, key=None)
其中,a
是一個有序列表,x
是要查找的元素,lo
和 hi
是查找范圍的左右邊界,key
是一個函數,用于從列表中提取比較的鍵值。
示例:
# 導入 bisect 庫 import bisect # 有序列表 a = [1, 2, 3, 3, 5, 6, 6, 6, 8, 10] # 查找元素 4 的位置 print(bisect.bisect_left(a, 4)) # 4 # 查找元素 6 的位置 print(bisect.bisect_left(a, 6)) # 5
bisect_right
函數用于在有序列表中二分查找某一位置,使得在該位置插入指定元素后仍保持有序,返回該位置,如果元素已經存在,則返回它的右邊位置。
函數原型如下:
bisect.bisect_right(a, x, lo=0, hi=len(a), *, key=None)
其中,a
是一個有序列表,x
是要查找的元素,lo
和 hi
是查找范圍的左右邊界,key
是一個函數,用于從列表中提取比較的鍵值。
示例:
# 導入 bisect 庫 import bisect # 有序列表 a = [1, 2, 3, 3, 5, 6, 6, 6, 8, 10] # 查找元素 4 的位置 print(bisect.bisect_right(a, 4)) # 4 # 查找元素 6 的位置 print(bisect.bisect_right(a, 6)) # 8
除此之外,bisect_right
還可以簡寫為 bisect
:
# 導入 bisect 庫 import bisect # 有序列表 a = [1, 2, 3, 3, 5, 6, 6, 6, 8, 10] # 查找元素 4 的位置 print(bisect.bisect(a, 4)) # 4 # 查找元素 6 的位置 print(bisect.bisect(a, 6)) # 8
insort_left
函數用于在有序列表中二分查找某一位置,使得在該位置插入指定元素后仍保持有序,然后將元素插入該位置,如果元素已經存在,則插入到它的左邊位置。
函數原型如下:
bisect.insort_left(a, x, lo=0, hi=len(a), *, key=None)
其中,a
是一個有序列表,x
是要插入的元素,lo
和 hi
是查找范圍的左右邊界,key
是一個函數,用于從列表中提取比較的鍵值。
示例:
# 導入 bisect 庫 import bisect # 有序列表 a = [1, 2, 3, 3, 5, 6, 6, 6, 8, 10] # 插入元素 4 bisect.insort_left(a, 4) print(a) # [1, 2, 3, 3, 4, 5, 6, 6, 6, 8, 10] # 插入元素 6 bisect.insort_left(a, 6) print(a) # [1, 2, 3, 3, 4, 5, 6, 6, 6, 6, 8, 10]
insort_right
函數用于在有序列表中二分查找某一位置,使得在該位置插入指定元素后仍保持有序,然后將元素插入該位置,如果元素已經存在,則插入到它的右邊位置。
函數原型如下:
bisect.insort_right(a, x, lo=0, hi=len(a), *, key=None)
其中,a
是一個有序列表,x
是要插入的元素,lo
和 hi
是查找范圍的左右邊界,key
是一個函數,用于從列表中提取比較的鍵值。
示例:
# 導入 bisect 庫 import bisect # 有序列表 a = [1, 2, 3, 3, 5, 6, 6, 6, 8, 10] # 插入元素 4 bisect.insort_right(a, 4) print(a) # [1, 2, 3, 3, 4, 5, 6, 6, 6, 8, 10] # 插入元素 6 bisect.insort_right(a, 6) print(a) # [1, 2, 3, 3, 4, 5, 6, 6, 6, 6, 8, 10]
除此之外,insort_right
還可以簡寫為 insort
:
# 導入 bisect 庫 import bisect # 有序列表 a = [1, 2, 3, 3, 5, 6, 6, 6, 8, 10] # 插入元素 4 bisect.insort(a, 4) print(a) # [1, 2, 3, 3, 4, 5, 6, 6, 6, 8, 10] # 插入元素 6 bisect.insort(a, 6) print(a) # [1, 2, 3, 3, 4, 5, 6, 6, 6, 6, 8, 10]
insort
函數的實質是調用 bisect
函數獲取插入位置,然后調用 list.insert
函數將元素插入到該位置。
在 Python 中,我們可以使用 bisect
庫來實現二分查找,但其只能根據元素的值和元素之間的比較關系來查找元素的位置,如果要根據元素的其他屬性或其他關系來查找元素的位置,就需要自己實現二分查找了。
二分查找的基本模板如下:
def binary_search(nums, target): left, right = 0, len(nums) - 1 while left <= right: mid = (left + right) // 2 if nums[mid] == target: return mid elif nums[mid] < target: left = mid + 1 else: right = mid - 1 return -1
通過修改模板,我們可以根據更復雜的關系來查找元素。
示例:
852. 山脈數組的峰頂索引
符合下列屬性的數組arr
稱為 山脈數組 :
arr.length >= 3
存在 i
(0 < i < arr.length - 1
)使得:
arr[0] < arr[1] < ... arr[i-1] < arr[i]
arr[i] > arr[i+1] > ... > arr[arr.length - 1]
給你由整數組成的山脈數組
arr
,返回任何滿足arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i + 1] > ... > arr[arr.length - 1]
的下標i
。
解
class Solution: def peakIndexInMountainArray(self, arr: List[int]) -> int: n = len(arr) left, right, ans = 1, n - 2, 0 while left <= right: mid = (left + right) // 2 if arr[mid] > arr[mid + 1]: ans = mid right = mid - 1 else: left = mid + 1 return ans
到此,相信大家對“Python二分查找之bisect庫如何使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。