python-線性查詢與二分查詢
線性查詢
線性查詢就是從頭到尾,直到符合條件了就返回。比如在一個list中找到一個等於5的元素並返回下標:
number_list = [0,1,2,3,4,5,6,7]
'''
enumerate()函式用於將一個可遍歷的資料物件(如列表、元組或字串)組合為一個索引序列,
同時列出資料和資料下標,一般用在 for 迴圈當中。
'''
#enumerate()用法例項
>>>seasons = ['Spring','Summer','Fall','Winter']
>>>list(enumerate(seasons))
[(0,'Spring' ),(1,'Summer'),(2,'Fall'),(3,'Winter')]
>>>list(enumerate(seasons,start=1)) #下標從1開始
[(1,'Spring'),(2,'Summer'),(3,'Fall'),(4,'Winter')]
#for 迴圈中使用enumerate
>>>seq = ['one','two','three']
>>>for i,element in enumerate(seq):
... print i, element
...
0 one
1 two
2 three
def linear_search(value,iterable):
for index,val in enumerate(iterable):
if val == value:
return index
return -1
assert linear_search(5,number_list) == 5
當然我們需要來一點花樣,比如傳一個謂詞進去,你要知道,在python裡一切 皆物件,所以我們可以把函式當成一個引數傳給另一個函式
def linear_search_v2(predicate,iterable):
for index,val in enumerate(iterable):
if predicate(val):
return index
return -1
assert linear_search_v2(lambda x: x==5, number_list) == 5
嘗試用遞迴來實現線性查詢
number_list = [0,1,2,3,4,5,6,7]
def linear_search_recusive(array,value):
if len(array) == 0:
return -1
index = len(array) - 1
if array[index] == value:
return index
return linear_search_recusive(array[0:index],value)
assert linear_search_recusive(number_list,5) == 5
assert linear_search_recusive(number_list,8) == -1
assert linear_search_recusive(number_list,7) == 7
assert linear_search_recusive(number_list,0) == 0
二分查詢
線性查詢針對的是無序序列,假如一個序列已經有序了呢,我們還需要 從頭找到尾嗎?當然不用,折半(二分)是一種經典思想。日常生活中還有 哪些經典的二分思想呢? 1.猜數字遊戲 2.一尺之棰,日取其半,萬世不竭 3.有些民間股神,告訴一堆人某個股票會漲,告訴另一半人會跌。 後來真漲了,慢慢又告訴信了他的一半人另一個股票會漲,另一半說 會跌。就這樣次數多了總有一些人信奉他為股神...
def binary_search(sorted_array,val):
if not sorted_array:
return -1
beg = 0
end = len(sorted_array) - 1
while beg <= end:
#beg + (end-beg)/2,為了遮蔽python 2/3 差異用了強轉
mid = int((beg + end) / 2)
if sorted_array[mid] == val:
return mid
elif sorted_array[mid] > val:
end = mid - 1
else:
beg = mid + 1
return -1
def test_binary_search():
a = list(range(10))
#正常值
assert binary_search(a,1) == 1
assert binary_search(a,-1) == -1
#異常值
assert binary_search(None,1) == -1
#邊界值
assert binary_search(a,0) == 0
相關推薦
python-線性查詢與二分查詢
線性查詢 線性查詢就是從頭到尾,直到符合條件了就返回。比如在一個list中找到一個等於5的元素並返回下標: number_list = [0,1,2,3,4,5,6,7] ''' enumerate()函式用於將一個可遍歷的資料物件(如列表、
Python實現素數篩法與二分查詢(遞迴)
def prime(n): if n<=2: return [] result=[False,False]+[True]*(n-2) for i in range(len(result)): if result[
STL之find與二分查詢
要使用find()函式需包含algorithm標頭檔案。 template <class InputIterator, class T> InputIterator find (InputIterator first, InputIterator last, const T&
遞迴函式與二分查詢演算法
一、遞迴函式 1.遞迴呼叫的定義 遞迴呼叫是函式巢狀呼叫的一種特殊形式,函式在呼叫時,直接或間接呼叫了自身,就是遞迴呼叫 def foo(n): print(n) n += 1 foo(n) foo(1) 2.遞迴最大深度 最大遞迴深度預設是
Python 遞迴實現二分查詢
def binarychop(lst, target, head, tail): if isinstance(lst, list): if len(lst) == 0: return -1 head = head tail = tail
線性查詢和二分查詢
線性查詢 def linear_search(data_set,value): for i in range(len(data_set)): if data_set[i]==value: return i return print(li
二分查詢與二分答案
二分 •主要用於在一個單調的函式中查詢某值 • 連續函式的情況: • 若當前查詢的區間是 [l, r] ,查詢的值是 y ,函式單增 • 設 mid = (l + r) / 2 若 f(mid) < y 則 l = mid, 否則 r = mid • 直至 r - l
二分查詢與二分排序
二分查詢 二分查詢我們又叫它為折半查詢法,二分查詢的條件是查詢物件必須是順序表,並且表必須有序,我們以陣列為例,模擬一下查詢的過程: 假設這是我們要查詢的陣列,查詢的資料為78 我們需要三個標誌left,right,mid分別記錄陣列的左端,右端,和中間位置,然後我們將要查詢的資料
與二分查詢類似的三分搜尋
原理什麼的都是相同的,三分搜尋也是基於分治思想的查詢演算法。 但是我們仔細想想二分查詢,是不是隻適合單調函式。 而三分搜尋可以用於凸函式和凹函式。 三分搜尋同樣有left和right,但是中點不再是一個mid,而是兩個 midl=(left+right)
STL中與二分查詢相關的4個函式
二分查詢的原理非常簡單,但寫出的程式碼中很容易含有很多Bug,二分查詢一文中講解過如何實現不同型別的二分查詢,但是否一定要自己去實現二分查詢呢?答案顯然是否定的,本文將講解STL中與二分查詢有關函式的具體使用方法及其實現原理。 函式使用 STL中與二分查詢相關的函式有
Java — 線性查詢和二分查詢法
1,線性查詢法: 工作原理:它又稱之為順序查詢。在一列給定的值中進行搜尋,從一端開始逐一檢查每個元素,直到找到所需元素的過程 ●查詢指定的數在陣列中出現的位置,找到返回下標,找不到返回-1 程式碼如下: import java.util.Scanner; publi
彙編器優化,指令名連結串列排序與二分查詢
在彙編器的詞法分析階段,需要對獲取的指令名進行有效性驗證並儲存對應的指令型別。然而,當前實現方法在效率和管理性方面還有不足,顧需進行優化,主要工作如下圖。 前期實現時,為了快速匹配指令名,建立了一個與指令集對應的全域性陣列,該陣列按字母表順序索引指令名。具體而言就是將
Python遞迴函式,二分查詢演算法
目錄 一、初始遞迴 二、遞迴示例講解 二分查詢演算法 一、初始遞迴 遞迴函式:在一個函式裡在呼叫這個函式本身。 遞迴的最大深度:998 正如你們剛剛看到的,遞迴函式如果不受到外力的阻止會一直執行
樹狀數組的區間修改與單點查詢與區間查詢
pri 區間 stream 個數 普通 sca ace 一個數 n) 如何將普通樹狀數組升級 普通的單點修改單點查詢就不講了,從區間修改和單點查詢講起。 原來的值存在a[]裏面,多建立個數組c1[],註意:c1[i]=a[i]-a[i-1]。 那麽求a[
真題2001 折半查詢(二分查詢)
題目:折半查詢(二分查詢),她僅適合有序的順序表。 基本思想:首先將給定值key與表中中間位置元素的關鍵字比較,若想等,則查詢成功,返回該元素的儲存位置;若不等則查詢元素只能在中間元素以外的前半部分或者後半部分。然後在縮小的範圍內繼續進行同樣的查詢,如此重複直到找到為止,或者確定表中沒有所需
sql92查詢與sql99查詢實現的三種方式(講義)
--SQL92&SQL99實現三表聯合查詢 --建立city表:使用圖形操作即可 --給city表新增測試資料 insert into city values(1,'商丘','歷史聞名古都'); insert into city values(2,'邯鄲','歷史聞名
F查詢與Q查詢
F查詢 如果我們要對兩個欄位的值做比較,那該怎麼做呢? Django 提供 F() 來做這樣的比較。F() 的例項可以在查詢中引用欄位,來比較同一個 model 例項中兩個不同欄位的值。 # 查詢評論數大於收藏數的書籍 from django.db.models import F
leetcode 704. 二分查詢 【二分查詢】
題目; 給定一個 n 個元素有序的(升序)整型陣列 nums 和一個目標值 target ,寫一個函式搜尋 nums 中的 target,如果目標值存在返回下標,否則返回 -1。
ORM查詢之基於物件的正向查詢與反向查詢
一、為什麼有正向查詢和反向查詢? 舉例有兩張表,一張表叫書籍表,一張表叫出版社表,他們關係是一對多的關係,書籍是一,出版社是多,因為一本書應該只有一個出版社對應,而出版社可以有多本書對應。 那麼在實際程式碼中定義他們關係的類中,設定外來鍵的那個屬性"publisher"是在多的那個類中,也就是
分組查詢與模糊查詢
查詢 分組查詢關鍵字:group by 注意:select 後的列名必須出現在group by 後面 例如: Select 列名 from 表名 where 條件