演算法 二分法

2021-10-08 04:36:02 字數 1820 閱讀 9392

從乙個有序陣列查詢指定元素

ll = [1,2,3…100]

普通查詢:

如果查詢的數字是66, 從最小開始查詢,需要66次才能找到。

def search1(ll, num):

for i in ll:

if i==num:

return i

return none

二分查詢說明:

如果查詢的數字是99, 可以先從中間開始匹配:

第一次,50, 比66小

第二次,75, 比66大

第三次,63, 比66小

第四次,69, 比66大

第五次,66, 找到了

def search(ll, num):

#初始搜尋範圍

low = 0 #最小索引

hight = len(ll)-1 #最大索引

while low <=hight:

mid = math.ceil((low+hight)/2) #中間索引向上取整

if ll[mid]==num: #如果找到就返回

return mid

elif ll[mid] < num: #如果目標數比中間索引數大,則改變最小的搜尋範圍為中間索引向上

low = mid + 1

else:

hight = mid - 1 #如果目標數比中間索引數小,則改變最大的搜尋範圍為中間索引向下

return none

ll = [1,6,8,9,10,45]

print(search(ll, 9))

再如:查詢聯絡人

import time

import math

import random

contact =

for i in range(100):

name = ""

for j in range(5):

name += random.choice("abcdefghijklmnopqrstuvwxyz")

contact = sorted(contact)

def search(contact, name):

low = 0

hight = len(contact)-1

c = 0

while low<=hight:

c +=1

mid = math.ceil((low+hight)/2)

temp_list = [contact[mid],name]

temp_list = sorted(temp_list)

if contact[mid]==name:

return mid, c

if temp_list[0]==contact[mid]:

low = mid + 1

else:

hight = mid - 1

return none

#50個聯絡人

print(search(contact, contact[49])) #(49, 5)

#最多尋找次數

num = math.log2(50)

print(num) #5.643856189774724

#100個聯絡人

print(search(contact, contact[99])) #(99, 6)

#最多尋找次數

num = math.log2(100)

print(num) #6.643856189774724

二分法 演算法

查詢演算法中的 二分法 是這樣定義的 給定n個從小到大排好序的整數序列list,以及某待查詢整數x,我們的目標是找到x在list中的下標。即若有list i x,則返回i 否則返回 1表示沒有找到。二分法是先找到序列的中點list m 與x進行比較,若相等則返回中點下標 否則,若list m x,則...

演算法 二分法

二分法可以歸為兩大類 二分查詢演算法 二分排序演算法 二分合併演算法 演算法中經常用到二分查詢演算法,比如最常規的應用就是在乙個有序陣列中找特定的數,但是如何寫出乙個完整準確的二分法呢,邊界條件如何判斷,到底是等於還是不等?可能會困惱大家,比如說查詢第乙個等於5的數,那又在如何查詢呢?查詢最後乙個等...

二分法 演算法

二分法查詢,這個演算法要求資料要是有序的。比如有這樣的問題 找出乙個陣列中,兩個數的和小於等於15,然後輸出他們,否則就單獨輸出較大的數。binarysearch.cpp include using namespace std void binarysearch int array,int leng...