我的代碼如下:
import bisect
a = [186, 186, 150, 200, 160, 130, 197, 200]
print("left",bisect.bisect_left(a,150))
回傳值為:0
但正如Python 3.9的檔案中所指定的:
如果 x 已經存在于 a 中,則插入點將位于任何現有條目之前(左側)。
150 存在于串列“a”中,因此回傳值應該是1 (i.e., a.index(150) - 1),但實際回傳值是0。你能解釋一下原因嗎?
uj5u.com熱心網友回復:
該bisect模塊和通常底層的二進制搜索演算法是為排序資料制作的。對于未排序的資料,結果實際上是任意的。
對于bisect_left演算法排序性意味著演算法不必檢查相等性:在序列中,任何現有的“左側”a位置是和的位置。這是因為 sorted-ness 強制執行.
因此,從技術上講,插入點將位于任何等于或大于的現有條目之前(左側) 。排序保證這是在任何現有條目之前。ixa[i] < xx <= a[i 1]a[j] <= a[j 1]xx
對于序列[186, 186, 150, 200, 160, 130, 197, 200]and x=150,插入點是0因為:
- 該串列最初分為
[186, 186, 150, 200]和[160, ...]。 - 右二等分的頭等于或大于
x; 假設 sorted'ness,不能有一個小于x它的值。 - 左二等分中的所有值都等于或大于
x; 假設 sorted'ness,插入點必須在所有這些之前。
左二等分的所有值之前的唯一點是0。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/411324.html
標籤:
