二分前提是有序,否則不可以二分
二分查詢演算法的是時間複雜度o(log n)
函式可以分2類:
bisect系,用於查詢index
insort系,用於實際插入
預設重複時從右邊插入
import bisect
lst =[37
,88,20
,50,30
,65,41
,50]newlst =
sorted
(lst)
# 公升序
print
(newlst)
# [20, 30, 37, 41, 50, 50, 65, 88]
print
(list
(enumerate
(newlst)))
# [(0, 20), (1, 30), (2, 37), (3, 41), (4, 50), (5, 50), (6, 65), (7, 88)]
print
(bisect.bisect(newlst,20)
)# 1
print
(bisect.bisect(newlst,30)
)# 2
print
(bisect.bisect(newlst,40)
)# 3
print
(bisect.bisect_left(newlst,20)
)# 0
print
(bisect.bisect_left(newlst,30)
)# 1
print
(bisect.bisect_left(newlst,40)
)# 3
for x in(20
,30,40
,100):
bisect.insort_left(newlst, x)
print
(newlst)
# print(newlst) 列印結果[20
,20,30
,37,41
,50,50
,65,88
][20,
20,30,
30,37,
41,50,
50,65,
88][20
,20,30
,30,37
,40,41
,50,50
,65,88
][20,
20,30,
30,37,
40,41,
50,50,
65,88,
100]
判斷學生成績,成績等級a-e。其中,90分以上為』a『,80-89分為』b『,70-79分為』c』,60-69分為』d』,60分以下為』e『
import bisect
defget_grade
(score)
: breakpoints =[60
,70,80
,90] grades =
'edcba'
return grades[bisect.bisect(breakpoints, score)
]for x in(91
,82,77
,65,50
,60,70
,80,90
):print
('{} => {}'
.format
(x, get_grade(x)
))
執行結果
91
=> a82=
> b77=
> c65=
> d50=
> e60=
> d70=
> c80=
> b90=
> a
Python演算法 二分查詢
二分查詢 binary search 也被稱為折半查詢,是在乙個有序陣列中查詢特定元素位置的查詢演算法。二分查詢要求查詢序列必須採用順序儲存,且表中元素按關鍵字有序排列。首先,假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功 否則利用中間位置記錄將表分成...
python二分查詢演算法
楔子 如果有這樣乙個列表,讓你從這個列表中找到66的位置,你要怎麼做?l 2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88 你說,so easy!l.index 66 我們之所以用index方法可以找到,是...
Python查詢演算法之二分查詢
從有序列表的初始候選區ls 0 n 開始,對待查詢的值與候選區中間的值比較,使得候選區規模減半 o logn 如果列表已經是有序的了,直接上二分 如果列表是亂序的,那麼要考慮查詢次數,如果查詢次數不頻繁,就用線性,因為排序的時間複雜度 o n 如果查詢次數頻率高,可以考慮先排序,再用二分 usr b...