Python实现的数据结构与算法之基本搜索详解


Posted in Python onApril 22, 2015

本文实例讲述了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 True
    elif 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) // 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.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程序设计有所帮助。

Python 相关文章推荐
Python中强大的命令行库click入门教程
Dec 26 Python
Python中偏函数用法示例
Jun 07 Python
详解Python3除法之真除法、截断除法和下取整对比
May 23 Python
python django model联合主键的例子
Aug 06 Python
python网络爬虫 Scrapy中selenium用法详解
Sep 28 Python
布隆过滤器的概述及Python实现方法
Dec 08 Python
Python实现屏幕录制功能的代码
Mar 02 Python
python实现在线翻译功能
Mar 03 Python
TensorFLow 数学运算的示例代码
Apr 21 Python
Python join()函数原理及使用方法
Nov 14 Python
教你怎么用Python实现多路径迷宫
Apr 29 Python
python实现的人脸识别打卡系统
May 08 Python
Python实现的数据结构与算法之链表详解
Apr 22 #Python
Python实现的数据结构与算法之双端队列详解
Apr 22 #Python
Python实现的数据结构与算法之队列详解
Apr 22 #Python
详尽讲述用Python的Django框架测试驱动开发的教程
Apr 22 #Python
Hadoop中的Python框架的使用指南
Apr 22 #Python
Python实现提取文章摘要的方法
Apr 21 #Python
python中map、any、all函数用法分析
Apr 21 #Python
You might like
PHP队列用法实例
2014/11/05 PHP
php实现按指定大小等比缩放生成上传图片缩略图的方法
2014/12/15 PHP
Linux环境下php实现给网站截图的方法
2016/05/03 PHP
PHP curl 或 file_get_contents 获取需要授权页面的方法
2017/05/05 PHP
PHP中TP5 上传文件的实例详解
2017/07/31 PHP
jQuery 跨域访问问题解决方法
2009/12/02 Javascript
DIV+CSS+JS不间断横向滚动实现代码
2013/03/19 Javascript
js判断鼠标左、中、右键哪个被点击的方法
2015/01/27 Javascript
jQuery+php实时获取及响应文本框输入内容的方法
2016/05/24 Javascript
Node.js包管理器Yarn的入门介绍与安装
2016/10/17 Javascript
vue父子组件的数据传递示例
2017/03/07 Javascript
原生JS实现的双色球功能示例
2018/02/02 Javascript
JQuery中的常用事件、对象属性与使用方法分析
2019/12/23 jQuery
Python使用ConfigParser模块操作配置文件的方法
2018/06/29 Python
Python实现将数据写入netCDF4中的方法示例
2018/08/30 Python
对Python 内建函数和保留字详解
2018/10/15 Python
在python中使用with打开多个文件的方法
2019/01/07 Python
Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例
2019/02/21 Python
python 堆和优先队列的使用详解
2019/03/05 Python
Python assert语句的简单使用示例
2019/07/28 Python
python pyqtgraph 保存图片到本地的实例
2020/03/14 Python
HTML5进阶段内联标签汇总(小篇)
2016/07/13 HTML / CSS
C语言如何决定使用那种整数类型
2016/11/26 面试题
软件测试企业面试试卷
2016/07/13 面试题
高中三年学习生活的自我评价
2013/10/10 职场文书
《跨越百年的美丽》教学反思
2014/02/11 职场文书
技能比赛获奖感言
2014/02/14 职场文书
微笑服务演讲稿
2014/05/13 职场文书
小组口号大全
2014/06/09 职场文书
正风肃纪剖析材料
2014/09/30 职场文书
公务员年终个人总结
2015/02/12 职场文书
2015年环卫工作总结
2015/04/28 职场文书
运输公司工作总结
2015/08/11 职场文书
小学一年级班主任工作经验交流材料
2015/11/02 职场文书
小学三年级班主任工作经验交流材料
2015/11/02 职场文书
解决mysql:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO/YES)
2021/06/26 MySQL