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 相关文章推荐
仅用50行代码实现一个Python编写的计算器的教程
Apr 17 Python
基于Python如何使用AIML搭建聊天机器人
Jan 27 Python
在Python的一段程序中如何使用多次事件循环详解
Sep 07 Python
python同时遍历数组的索引和值的实例
Nov 15 Python
python画图系列之个性化显示x轴区段文字的实例
Dec 13 Python
django orm 通过related_name反向查询的方法
Dec 15 Python
对python特殊函数 __call__()的使用详解
Jul 02 Python
python将字符串转换成json的方法小结
Jul 09 Python
python通过实例讲解反射机制
Oct 17 Python
Django封装交互接口代码
Jul 12 Python
一篇文章教你用python画动态爱心表白
Nov 22 Python
OpenCV-Python实现油画效果的实例
Jun 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编程文件处理类SplFileObject和SplFileInfo用法实例分析
2017/07/22 PHP
关于JavaScript的一些看法
2009/05/27 Javascript
JavaScript 拾碎[三] 使用className属性
2010/10/16 Javascript
图片无缝滚动代码(向左/向下/向上)
2013/04/10 Javascript
Javascript事件实例详解
2013/11/06 Javascript
利用javascript实现禁用网页上所有文本框,下拉菜单,多行文本域
2013/12/14 Javascript
jQuery实现瀑布流的取巧做法分享
2015/01/12 Javascript
javascript实现校验文件上传控件实例
2015/04/20 Javascript
JavaScript统计网站访问次数的实现代码
2015/11/18 Javascript
JavaScript+CSS无限极分类效果完整实现方法
2015/12/22 Javascript
JS简单实现String转Date的方法
2016/03/02 Javascript
js类式继承与原型式继承详解
2016/04/07 Javascript
Javascript基础_嵌入图像的简单实现
2016/06/14 Javascript
Bootstrap实现登录校验表单(带验证码)
2016/06/23 Javascript
第一次接触神奇的Bootstrap表单
2016/07/27 Javascript
5种JavaScript脚本加载的方式
2017/01/16 Javascript
JavaScript解析任意形式的json树型结构展示
2017/07/23 Javascript
Angular2仿照微信UI实现9张图片上传和预览的示例代码
2017/10/19 Javascript
JavaScript生成简单等差数列
2017/11/28 Javascript
bootstrap table插件动态加载表头
2019/07/19 Javascript
js实现图片区域可点击大小随意改变(适用移动端)代码实例
2019/09/11 Javascript
微信浏览器左上角返回按钮监听的实现
2020/03/04 Javascript
js屏蔽F12审查元素,禁止修改页面代码等实现代码
2020/10/02 Javascript
python编程嵌套函数实例代码
2018/02/11 Python
Python简单实现的代理服务器端口映射功能示例
2018/04/08 Python
python os用法总结
2018/06/08 Python
Python2包含中文报错的解决方法
2018/07/09 Python
python多线程与多进程及其区别详解
2019/08/08 Python
使用Keras中的ImageDataGenerator进行批次读图方式
2020/06/17 Python
html5 桌面提醒:Notifycations应用介绍
2012/11/27 HTML / CSS
中国茶叶、茶具一站式网上购物商城:醉品茶城
2018/07/03 全球购物
Ray-Ban雷朋西班牙官网:全球领先的太阳眼镜品牌
2018/11/28 全球购物
求职信的要素有哪些呢
2013/12/26 职场文书
商学院大学生求职的自我评价
2014/03/12 职场文书
初三班主任寄语大全
2014/04/04 职场文书
歼十出击观后感
2015/06/11 职场文书