Python 二分查詢演算法

2021-09-23 13:27:09 字數 1937 閱讀 9656

二分前提是有序,否則不可以二分

二分查詢演算法的是時間複雜度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...