演算法 二分查詢及演算法快慢表示法

2021-08-24 17:41:33 字數 1783 閱讀 7812

大o表示法是指最糟糕情況下程式所執行的次數,demo:0-100的陣列,查詢(0),按順序查詢—-線性的,1次就找到了,要找(100)這個陣列,就得執行100次,也就是最糟糕的情況下,大o表示法所執行的次數,線性,o(n)

常見大o速度

1.

o(logn),對數是冪的逆運算,log預設指的是以2為底以n為真數

2.o(n),n個數執行n次

3.o(nlogn),

4.o(n^2)

5.o(n!)

可以看出,根據n大小不同(有序列表的長度)大o表示法的增速不同,所以根據你的資料量來確定乙個好的演算法,使你的程式執行速度加快,提高使用者體驗,減少等待時間是明智之選,乙個好的程式,離不開演算法。

二分查詢所需元素:1乙個有序列表list;2:你要查詢的item;

demo:有個列表list:0-100;item:67

第一次查詢:取中間值50,你說小了,把50複製給最小值,min+1就在【51-100】之間取值

第二次查詢:取中間值75:你說大了:把75賦值給最大值,max-1就在【51-74】之間取值

第三次查詢:取中間值62:你說小了:把62賦值給最小值,min+1就在【63-74】之間取值

第四次查詢:取中間值68:你說大了:把68賦值給最大值,max-1就在【63-73】之間取值

第五次查詢:取中間值71:你說小了:把68賦值給最小值,min+1就在【69-71】之間取值

第六次查詢:取中間值70:你說大了,把70賦給最大值,max-1 就在【69-69】之間取中間值

第七次查詢:取中間值:67!找到了

也就是2^7=128,二分查詢執行次數為log100約=7

所以二分查詢的執行次數為:o(logn)

如果是順序查詢的話為o(n),你要查詢的是67,就要執行67次

假如:你有乙個40億的乙個有序列表,查詢第40億個數,普通查詢就得執行40億次,假如每次執行查詢耗時1毫秒,40億次就是執行了40億毫秒,4000000000就得執行40億/1000(毫秒)/3600(轉換成小時)/24(轉換成天)=4.6天

如果用二分查詢就是log4000000000=31.8毫秒;

由此可見,二分查詢,資料量越大,所需時間越短,執行效率越高。

def

binary_search

(list,item):

# 取最大值,和最小值的下標,

low = 0

height = len(list)-1

while low < height:

# set_trace()

mid = (low+height)/2

print(mid)

guess = list[mid]

if guess == item:

return guess

elif item > guess:

low = mid+1

elif item < guess:

height = mid-1

else:

return

none

print(guess,list[low],list[height])

結果如下
50

(50, 51, 100)

75(75, 51, 74)

62(62, 63, 74)

68(68, 69, 74)

71(71, 69, 70)

69

演算法 二分查詢法

例題 設計乙個函式,接收乙個有序陣列和乙個元素,如果指定的元素包含在陣列中,則返回其位置。看見這道題,我們正常的想法為遍歷陣列的所有元素然後乙個乙個的與數值相比較,如果相等,返回索引,如果在迴圈執行完後沒有退出函式的話,就返回false。為 var count 0 計數 function looku...

查詢演算法 二分查詢法

二分查詢法是經典的入門演算法,以高效和廣泛應用而著稱.演算法是由靜態方法rank 實現的,它接受乙個整數鍵和乙個已經有序的int 陣列作為引數。如果該鍵存在於陣列中 則返回它的索引,否則返回 1。演算法使用兩個變數low 和high,並保證如果鍵在陣列中則它一定在 a low high 中,然後方法...

二分查詢演算法c語言 演算法總結 二分查詢法

在leetcode的題目討論中,經常會有些大神將某一類的題目結題思路給整理了出來,感覺受益匪淺。受之啟發,萌生了自己也總結一下常見演算法的解題思路的想法,希望可以讓自己在這個總結的過程中可也融匯貫通這些思路,同時可以給後來者以啟發。從 開始好呢?就從經典的二分查詢法開始吧,這個演算法幾乎所有學過計算...