Python實現的資料結構與演算法之基本搜尋詳解

2022-10-04 23:06:40 字數 3712 閱讀 3682

一、順序搜尋

順序搜尋 是最簡單直觀的搜尋方法:從列表開頭到末尾,逐個比較待搜尋項與列表中的項,直到找到目標項(搜尋成功)或者 超出搜尋範圍 (搜尋失敗)。

根據列表中的項是否按順序排列,可以將列表分為 無序列表 和 有序列表。對於 無序列表,超出搜尋範圍 是指越過列表的末尾;對於 有序列表,超過搜尋範圍 是指進入列表中大於目標項的區域(發生在目標項小於列表末尾項時)或者指越過列表的末尾(發生在目標項大於列表末尾項時)。

1、無序列表

在無序列表中進行順序搜尋的情況如圖所示:

def sequentialsearch(items, target):

for item in items:

if item == target:

return true

return false

2、有序列表

在有序列表中進行順序搜尋的情況如圖所示:

def orderedsequentialsearch(items, target):

for item in items:

if item == target:

return true

elif item > target:

break

return false

二、二分搜尋

實際上,上述orderedsequentialsearch演算法並沒有很好地利用有序列表的特點。

二分搜尋 充分利用了有序列表的優勢,該演算法的思路非常巧妙:在原列表中,將目標項(target)與列表中間項(middle)進行對比,如果target等於middle,則搜尋成功;如果target小於middle,則在middle的左半列表中繼續搜尋;如果target大於middle,則在middle的右半列表中繼續搜尋。qspprkztpw

在有序列表中進行二分搜尋的情況如圖所示:

根據實現方式的不同,二分搜尋演算法可以分為迭代版本和遞迴版本兩種:

1、迭代版本

def iterativebinarysearch(items, target):

first = 0

last = len(items) - 1

while first <= last:

mi程式設計客棧ddle = (first + last) // 2

if target == items[middle]:

return true

elif target < items[middle]:

last = middle - 1

else:

first =www.cppcns.com middle + 1

return false

2、遞迴版本

def recursivebinarysearch(items, target):

if len(items) == 0:

return false

else:

middle = len(items) // 2

if target == items[middle]:

qspprkztpw return true

elif target < items[middle]:

return recursivebinarysearch(items[:middle], target)

else:

return recursivebinarysearch(items[middle+1:], target)

三、效能比較

上述搜尋演算法的時間複雜度如下所示:

搜尋演算法 時間複雜度

-----------------------------------

sequentialsearch o(n)

-----------------------------------

orderedsequentialsearch o(n)

-----------------------------------

iterativebinarysearch o(log n)

-----------------------------------

recursivebinarysearch o(log n)

-----------------------------------

in o(n)

可以看出,二分搜尋 的效能要優於 順序搜尋。

值得注意的是,python的成員操作符 in 的時間複雜度是o(n),不難猜出,操作符 in 實際採用的是 順序搜尋 演算法。

四、演算法測試

#!/usr/bin/env python

# -*- coding: utf-8 -*-

def test_print(algorithm, listname, target):

print(' %d is%s in %s' % (target, '' if algorithm(eval(listname), target) else ' not', listname))

if __name__ == '__main__':

testlist = [1, 2, 32, 8, 17, 19, 42, 13, 0]

orderedlist = sorted(testlist)

print('sequentialsearch:')

test_print(sequentialsearch, 'testlist', 3)

test_print(sequentialsearch, 'testlist', 13)

print('orderedsequentialsearch:')

test_print(orderedsequentialsearch, 'orderedlist', 3)

test_print(orderedsequentialsearch, 'orderedlist', 13)

print('iterativebinarysearch:')

test_print(iterativebinarysearch, 'orderedlist', 3)

test_print(iterativebinarysearch, 'orderedlist', 13)

print('recursivebinarysearch:')

test_print(recursivebinarysearch, 'orderedlist', 3)

test_print(recursivebinarysearch, 'orderedlist', 13)

執行結果:

$ python testbasicsearch.py

sequentialsearch:

3 is not in testlist

13 is in testlist

orderedsequentialsearch:

3 is not in orderedlist

13 is in orderedlist

iterativebinarysearch:

3 is not in orderedlist

13 is in orderedlist

recursivebinarysearch:

3 is not in orderedlist

13 is in orderedlist

本文標題: python實現的資料結構與演算法之基本搜尋詳解

本文位址: /jiaoben/python/123290.html

算分與資料結構 冒泡思想

冒泡思想的乙個特點是所有的操作都在原陣列中進行,不占用額外的空間。一 氣泡排序 public class bubblesort public static void main string args new bubblesort bubblesort array for int i 0 i 二 冒泡...

資料結構 Python實現

參考部落格 演算法和資料結構 一 棧和佇列 python資料結構 棧 佇列的實現 一 python資料結構 棧 佇列的實現 二 python資料結構 鍊錶的實現 資料結構 定義 簡單來說,資料結構就是設計資料以何種方式組織並儲存在計算機中。比如 列表 集合與字典等都是一種資料結構。ps 程式 資料結...

資料結構 Python實現

參考部落格 演算法和資料結構 一 棧和佇列 python資料結構 棧 佇列的實現 一 python資料結構 棧 佇列的實現 二 python資料結構 鍊錶的實現 資料結構 定義 簡單來說,資料結構就是設計資料以何種方式組織並儲存在計算機中。比如 列表 集合與字典等都是一種資料結構。ps 程式 資料結...