<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
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
。來源:力扣(LeetCode)
連結:https://leetcode.cn/problems/peak-index-in-a-mountain-array
解
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庫的使用的文章就介紹到這了,更多相關Python bisect庫使用內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45