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

首頁 > 編程 > Python > 正文

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

2019-11-25 17:41:09
字體:
來源:轉載
供稿:網友

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

一、順序搜索

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

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

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的右半列表中繼續搜索。

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

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

1、迭代版本

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

2、遞歸版本

def recursiveBinarySearch(items, target):  if len(items) == 0:    return False  else:    middle = len(items) // 2    if target == items[middle]:      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.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程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 遂溪县| 翁源县| 开封市| 楚雄市| 灵石县| 台中市| 保山市| 陕西省| 仁布县| 博罗县| 红桥区| 科技| 平昌县| 凯里市| 鄱阳县| 阜新市| 靖西县| 镇沅| 东台市| 泌阳县| 大姚县| 道孚县| 万盛区| 颍上县| 井冈山市| 定远县| 平原县| 哈密市| 德安县| 安庆市| 报价| 全州县| 常州市| 吐鲁番市| 怀安县| 博爱县| 安泽县| 连云港市| 武冈市| 东乡族自治县| 普洱|