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列表计数及插入实例
Dec 17 Python
python写日志封装类实例
Jun 28 Python
Python实现自动登录百度空间的方法
Jun 10 Python
从django的中间件直接返回请求的方法
May 30 Python
详解Pandas之容易让人混淆的行选择和列选择
Jul 10 Python
扩展Django admin的list_filter()可使用范围方法
Aug 21 Python
Django自定义模板过滤器和标签的实现方法
Aug 21 Python
解决numpy矩阵相减出现的负值自动转正值的问题
Jun 03 Python
python实例化对象的具体方法
Jun 17 Python
如何用Python绘制3D柱形图
Sep 16 Python
selenium.webdriver中add_argument方法常用参数表
Apr 08 Python
Python提取PDF指定内容并生成新文件
Jun 09 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 替换模板变量实现步骤
2009/08/24 PHP
php数组函数序列之in_array() 查找数组值是否存在
2011/10/29 PHP
php中选择什么接口(mysql、mysqli)访问mysql
2013/02/06 PHP
php实现12306火车票余票查询和价格查询(12306火车票查询)
2014/01/14 PHP
使用PHP生成PDF方法详解
2015/01/23 PHP
php计算一个文件大小的方法
2015/03/30 PHP
PHP格式化显示时间date()函数代码
2018/10/03 PHP
jquery异步调用页面后台方法&amp;#8207;(asp.net)
2011/03/01 Javascript
JS替换文本域内的回车示例
2014/02/18 Javascript
node.js开发中使用Node Supervisor实现监测文件修改并自动重启应用
2014/11/04 Javascript
非jQuery实现照片散落桌子上,单击放大的LightBox效果
2014/11/28 Javascript
使用Chart.js图表库制作漂亮的响应式表单
2015/10/28 Javascript
javascript 广告移动特效的实现代码
2016/06/25 Javascript
js HTML5多图片上传及预览实例解析(不含前端的文件分割)
2016/08/26 Javascript
JavaScript模板引擎Template.js使用详解
2016/12/15 Javascript
Angular2 http jsonp的实例详解
2017/08/31 Javascript
vue.js根据代码运行环境选择baseurl的方法
2018/02/28 Javascript
elementUI多选框反选的实现代码
2019/04/03 Javascript
使用Layer组件弹出多个对话框(非嵌套)与关闭及刷新的例子
2019/09/25 Javascript
JavaScript中的惰性载入函数及优势
2020/02/18 Javascript
python 算法 排序实现快速排序
2012/06/05 Python
Python实现Const详解
2015/01/27 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
2018/02/13 Python
PyTorch线性回归和逻辑回归实战示例
2018/05/22 Python
python numpy数组的索引和切片的操作方法
2018/10/20 Python
Python Tkinter 简单登录界面的实现
2019/06/14 Python
python 3.74 运行import numpy as np 报错lib\site-packages\numpy\__init__.py
2019/10/06 Python
python数据化运营的重要意义
2019/11/25 Python
html5教你做炫酷的碎片式图片切换 (canvas)
2017/07/28 HTML / CSS
荷兰照明、灯具和配件网上商店:dmlights
2019/08/25 全球购物
美体小铺印度官网:The Body Shop印度
2019/10/17 全球购物
企业党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
心灵捕手观后感
2015/06/02 职场文书
银行求职信怎么写
2019/06/20 职场文书
成功的商业计划书这样写才最靠谱
2019/07/12 职场文书
创业计划书之DIY自助厨房
2019/09/06 职场文书