1. 程式人生 > >python-線性查詢與二分查詢

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 條件