從乙個有序陣列查詢指定元素
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...