国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python實現的數據結構與算法之基本搜索詳解

2020-01-04 19:25:49
字體:
來源:轉載
供稿:網友

本文實例講述了Python實現的數據結構與算法之基本搜索。分享給大家供大家參考。具體分析如下:

一、順序搜索

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

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

1、無序列表

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

Python實現的數據結構與算法之基本搜索詳解

def sequentialSearch(items, target): for item in items:if item == target:return True return False

2、有序列表

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

Python實現的數據結構與算法之基本搜索詳解

def orderedSequentialSearch(items, target): for item in items:if item == target:return Trueelif item > target:break return False

二、二分搜索

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

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

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

Python實現的數據結構與算法之基本搜索詳解

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

1、迭代版本

def iterativeBinarySearch(items, target): first = 0 last = len(items) - 1 while first <= last:middle = (first + last) // 2if target == items[middle]:return Trueelif target < items[middle]:last = middle - 1else:first = middle + 1 return False

2、遞歸版本

def recursiveBinarySearch(items, target): if len(items) == 0:return False else:middle = len(items) // 2if target == items[middle]:return Trueelif target < items[middle]:return recursiveBinarySearch(items[:middle], target)else:return recursiveBinarySearch(items[middle+1:], target)

三、性能比較

上述搜索算法的時間復雜度如下所示:

搜索算法時間復雜度-----------------------------------sequentialSearchO(n)-----------------------------------orderedSequentialSearch O(n) -----------------------------------iterativeBinarySearch O(log n)-----------------------------------recursiveBinarySearch O(log n)-----------------------------------inO(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.pysequentialSearch: 3 is not in testlist 13 is in testlistorderedSequentialSearch: 3 is not in orderedlist 13 is in orderedlistiterativeBinarySearch: 3 is not in orderedlist 13 is in orderedlistrecursiveBinarySearch: 3 is not in orderedlist 13 is in orderedlist

希望本文所述對大家的Python程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 浙江省| 石柱| 正安县| 出国| 新巴尔虎右旗| 石渠县| 通江县| 项城市| 临漳县| 碌曲县| 合作市| 谷城县| 泾源县| 朝阳区| 松江区| 称多县| 木里| 克东县| 牙克石市| 龙川县| 泽库县| 久治县| 湛江市| 岳阳县| 苍山县| 民丰县| 包头市| 潮州市| 称多县| 贵南县| 洛扎县| 白水县| 武川县| 嘉定区| 阳朔县| 鲁山县| 乌审旗| 固镇县| 汉阴县| 万载县| 渝中区|