一、順序搜尋
順序搜尋 是最簡單直觀的搜尋方法:從列表開頭到末尾,逐個比較待搜尋項與列表中的項,直到找到目標項(搜尋成功)或者 超出搜尋範圍 (搜尋失敗)。
根據列表中的項是否按順序排列,可以將列表分為 無序列表 和 有序列表。對於 無序列表,超出搜尋範圍 是指越過列表的末尾;對於 有序列表,超過搜尋範圍 是指進入列表中大於目標項的區域(發生在目標項小於列表末尾項時)或者指越過列表的末尾(發生在目標項大於列表末尾項時)。
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 程式 資料結...