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之赋值,简单也不简单
Sep 24 Python
python通过shutil实现快速文件复制的方法
Mar 14 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
Oct 25 Python
利用python为运维人员写一个监控脚本
Mar 25 Python
对Python 3.2 迭代器的next函数实例讲解
Oct 18 Python
python 同时运行多个程序的实例
Jan 07 Python
python并发编程多进程 互斥锁原理解析
Aug 20 Python
Python中zip()函数的简单用法举例
Sep 02 Python
Python3 xml.etree.ElementTree支持的XPath语法详解
Mar 06 Python
Keras 实现加载预训练模型并冻结网络的层
Jun 15 Python
Python 捕获代码中所有异常的方法
Aug 03 Python
Python eval函数介绍及用法
Nov 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和javascript常用正则表达式及用法实例
2014/07/01 PHP
Java和PHP在Web开发方面对比分析
2015/03/01 PHP
php使用Jpgraph绘制饼状图的方法
2015/06/10 PHP
PHP自带方法验证邮箱、URL、IP是否合法的函数
2016/12/08 PHP
PHP中“=&gt;
2019/03/01 PHP
js实现ASP分页函数 HTML分页函数
2006/09/22 Javascript
用倒置滤镜把div倒置,再把table倒置。
2007/07/31 Javascript
JavaScript面向对象之体会[总结]
2008/11/13 Javascript
基于jquery的cookie的用法
2011/01/10 Javascript
Jqgrid设置全选(选择)及获取选择行的值示例代码
2013/12/28 Javascript
jquery siblings获取同辈元素用法实例分析
2016/07/25 Javascript
IOS中safari下的select下拉菜单文字过长不换行的解决方法
2016/09/26 Javascript
Bootstrap分页插件之Bootstrap Paginator实例详解
2016/10/15 Javascript
微信小程序异步处理详解
2017/11/10 Javascript
vue基础之data存储数据及v-for循环用法示例
2019/03/08 Javascript
js实现省级联动(数据结构优化)
2020/07/17 Javascript
[02:38]2018DOTA2亚洲邀请赛赛前采访-VGJ.T
2018/04/03 DOTA
[46:50]Liquid vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python遍历文件夹和读写文件的实现代码
2016/08/28 Python
Python Paramiko模块的使用实际案例
2018/02/01 Python
Python3.6基于正则实现的计算器示例【无优化简单注释版】
2018/06/14 Python
tensorflow 加载部分变量的实例讲解
2018/07/27 Python
Python实现代码统计工具
2019/09/19 Python
Python中如何将一个类方法变为多个方法
2019/12/30 Python
MIRTA官网:手工包,100%意大利制造
2020/02/11 全球购物
介绍一下JNDI的基本概念
2013/07/26 面试题
创先争优公开承诺书
2014/08/30 职场文书
民事和解协议书格式
2014/11/29 职场文书
物业保安辞职信
2015/05/12 职场文书
鉴史问廉观后感
2015/06/10 职场文书
单位领导婚礼致辞
2015/07/28 职场文书
新年寄语2016
2015/08/17 职场文书
Python多个MP4合成视频的实现方法
2021/07/16 Python
CSS实现两列布局的N种方法
2021/08/02 HTML / CSS
JavaScript的function函数详细介绍
2021/11/20 Javascript
源码安装apache脚本部署过程详解
2022/09/23 Servers