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中利用await关键字如何等待Future对象完成详解
Sep 07 Python
python爬虫实现中英翻译词典
Jun 25 Python
python字符串替换第一个字符串的方法
Jun 26 Python
python自定义函数实现最大值的输出方法
Jul 09 Python
Python-Seaborn热图绘制的实现方法
Jul 15 Python
浅谈django url请求与数据库连接池的共享问题
Aug 29 Python
python3 图片 4通道转成3通道 1通道转成3通道 图片压缩实例
Dec 03 Python
Python tkinter常用操作代码实例
Jan 03 Python
python对文件的操作方法汇总
Feb 28 Python
Python和Bash结合在一起的方法
Nov 13 Python
Python Selenium XPath根据文本内容查找元素的方法
Dec 07 Python
用python修改excel表某一列内容的操作方法
Jun 11 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中返回引用类型的方法
2015/04/03 PHP
JS获取scrollHeight问题想到的标准问题
2007/05/27 Javascript
js nextSibling属性和previousSibling属性概述及使用注意
2013/02/16 Javascript
Flex通过JS获取客户端IP和计算机名的实例代码
2013/11/21 Javascript
用jQuery实现的智能隐藏、滑动效果的返回顶部代码
2014/03/18 Javascript
JS实现图片产生波纹一样flash效果的方法
2015/02/27 Javascript
jQuery编程中的一些核心方法简介
2015/08/14 Javascript
JS+CSS实现另类带提示效果的竖向导航菜单
2015/10/15 Javascript
详解Bootstrap四种图片样式
2016/01/04 Javascript
基于Node.js的强大爬虫 能直接发布抓取的文章哦
2016/01/10 Javascript
JS实现点击登录弹出窗口同时背景色渐变动画效果
2016/03/25 Javascript
利用forever和pm2部署node.js项目过程
2017/05/10 Javascript
Vue2.0 vue-source jsonp 跨域请求
2017/08/04 Javascript
vue.js打包之后可能会遇到的坑!
2018/06/03 Javascript
原生JS实现图片懒加载之页面性能优化
2019/04/26 Javascript
vue的路由映射问题及解决方案
2019/10/14 Javascript
详解js location.href和window.open的几种用法和区别
2019/12/02 Javascript
python访问sqlserver示例
2014/02/10 Python
Python2中的raw_input() 与 input()
2015/06/12 Python
Python正则抓取网易新闻的方法示例
2017/04/21 Python
Python实现网站表单提交和模板
2019/01/15 Python
python实现视频分帧效果
2019/05/31 Python
Python 图像处理: 生成二维高斯分布蒙版的实例
2019/07/04 Python
关于python中密码加盐的学习体会小结
2019/07/15 Python
Python GUI编程学习笔记之tkinter界面布局显示详解
2020/03/30 Python
Django全局启用登陆验证login_required的方法
2020/06/02 Python
波兰在线儿童和婴儿用品零售商:pinkorblue
2019/06/29 全球购物
全球最大的瓷器、水晶和银器零售商:Replacements
2020/06/15 全球购物
《画风》教学反思
2014/04/16 职场文书
和睦家庭事迹
2014/05/14 职场文书
银行求职信怎么写
2014/05/26 职场文书
党员学习党的群众路线思想汇报(5篇)
2014/09/10 职场文书
政风行风建设整改方案
2014/10/27 职场文书
2014年护理工作总结范文
2014/11/14 职场文书
男方婚前保证书
2015/02/28 职场文书
Nebula Graph解决风控业务实践
2022/03/31 MySQL