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的Flask开发框架简单上手笔记
Nov 16 Python
详解Python网络爬虫功能的基本写法
Jan 28 Python
Python实现定时任务
Feb 08 Python
windows系统下Python环境的搭建(Aptana Studio)
Mar 06 Python
使用Python对SQLite数据库操作
Apr 06 Python
Jupyter安装nbextensions,启动提示没有nbextensions库
Apr 23 Python
Python计算库numpy进行方差/标准方差/样本标准方差/协方差的计算
Dec 28 Python
python导入坐标点的具体操作
May 10 Python
python and or用法详解
Jun 26 Python
Django配置文件代码说明
Dec 04 Python
Python实现视频自动打码的示例代码
Apr 08 Python
Django框架之路由用法
Jun 10 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安装扩展mysqli的实现步骤及报错解决办法
2017/09/23 PHP
JavaScript中null与undefined分析
2009/07/25 Javascript
js类型转换与引用类型详解(Boolean_Number_String)
2014/03/07 Javascript
jquery实现的鼠标拖动排序Li或Table
2014/05/04 Javascript
indexedDB bootstrap angularjs之 MVC DOMO (应用示例)
2016/06/20 Javascript
Js 获取、判断浏览器版本信息的简单方法
2016/08/08 Javascript
对javascript继承的理解
2016/10/11 Javascript
JavaScript设计模式之代理模式详解
2017/06/09 Javascript
JS设置手机验证码60s等待实现代码
2017/06/14 Javascript
vue+webpack实现异步加载三种用法示例详解
2018/04/24 Javascript
在vue-cli 3中给stylus、sass样式传入共享的全局变量
2019/08/12 Javascript
对layui初始化列表的CheckBox属性详解
2019/09/13 Javascript
使用JS监听键盘按下事件(keydown event)
2019/11/07 Javascript
javascript实现贪吃蛇经典游戏
2020/04/10 Javascript
如何解决jQuery 和其他JS库的冲突
2020/06/22 jQuery
[04:49]期待西雅图之战 2016国际邀请赛中国区预选赛WINGS战队赛后采访
2016/06/29 DOTA
[01:00:35]2018DOTA2亚洲邀请赛3月30日B组 EffcetVSMineski
2018/03/31 DOTA
Python中if __name__ == &quot;__main__&quot;详细解释
2014/10/21 Python
Python不使用int()函数把字符串转换为数字的方法
2018/07/09 Python
python 判断参数为Nonetype类型或空的实例
2018/10/30 Python
浅析Python 实现一个自动化翻译和替换的工具
2019/04/14 Python
用python求一个数组的和与平均值的实现方法
2019/06/29 Python
详解pyinstaller selenium python3 chrome打包问题
2019/10/18 Python
Python如何将函数值赋给变量
2020/04/28 Python
Python 在函数上添加包装器
2020/07/28 Python
学python爬虫能做什么
2020/07/29 Python
利用CSS3的checked伪类实现OL的隐藏显示的方法
2010/12/18 HTML / CSS
佳能德国网上商店:Canon德国
2017/03/18 全球购物
英国领先的票务代理商之一:The Ticket Factory
2019/02/09 全球购物
校园广播稿500字
2014/02/04 职场文书
企业活动策划方案
2014/06/02 职场文书
新学期标语
2014/06/30 职场文书
2016年小学感恩节活动总结
2016/04/01 职场文书
企业内部管理控制:银行存款控制制度范本
2020/01/10 职场文书
go设置多个GOPATH的方式
2021/05/05 Golang
解决Pytorch半精度浮点型网络训练的问题
2021/05/24 Python