Python查詢演算法之二分查詢

2021-09-27 11:34:44 字數 1238 閱讀 5691

有序列表的初始候選區ls[0:n]開始,對待查詢的值與候選區中間的值比較,

使得候選區規模減半

o(logn)

如果列表已經是有序的了,直接上二分

如果列表是亂序的,那麼要考慮查詢次數,

如果查詢次數不頻繁,就用線性,因為排序的時間複雜度 > o(n);

如果查詢次數頻率高,可以考慮先排序,再用二分

#!/usr/bin/python3

# -*- coding: utf-8 -*-

"""二分查詢

從有序列表的初始候選區ls[0:n]開始,對待查詢的值與候選區中間的值進行比較,

使得候選區規模減半

時間複雜度:o(logn),但是排序的時間複雜度 > o(n)

問題:線性查詢與二分查詢的抉擇

1. 如果列表已經是有序的了,直接上二分

2. 如果列表是亂序的,那麼要考慮查詢次數,

如果查詢次數不頻繁,就用線性,因為排序的時間複雜度 > o(n);

如果查詢次數頻率高,可以考慮先排序,再用二分

"""def

binary_search

(ls, val)

:"""二分查詢

args:

:param ls: seq, 用於查詢的有序列表

:param val: any, 待查詢的值

returns:

1. int, 如果找到了, 返回對應的索引

2. -1, 如果找不到, 返回-1

"""left =

0 right =

len(ls)-1

while left <= right:

mid =

(left + right)//2

if ls[mid]

== val:

return mid

elif ls[mid]

> val:

right = mid -

1else

: left = mid +

1else

:return-1

ls =

range(10

)print

(binary_search(ls,11)

)

查詢演算法之 二分查詢

這個例項給出了二叉搜尋演算法在9個元素的陣列arr中查詢某個目標值的過程01 2345 678 7 35812 1623 3355 例子1 查詢目標值2301 2345 678 7 35812 1623 3355 步驟1 索引範圍 0,9 索引first 0,last 9,mid 0 9 2 4 t...

查詢演算法之二分查詢

二分查詢,也是經常會問道的,以下寫法主要是針對已經排好序,且不會受到重複元素影響的陣列使用。二分查詢 param string find 要查詢的值 param array array 要查詢的陣列 return bool string function binarysearch find arra...

查詢演算法之二分查詢

在乙個排好序的陣列t 1 n 中查詢x,如果x在t中,輸出x在t的下標j 如果x不在t中,輸出j 0。對於這樣的有序序列,可以使用二分查詢的演算法來實現。如下圖序列,二分查詢20。在有序表中,取中間資料作為比較物件,若給定值與中間記錄的數值相等,則查詢成功 若給定值小於中間值的數值,則在中間值的左半...