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编写简单网络爬虫抓取视频下载资源
Nov 04 Python
python中set常用操作汇总
Jun 30 Python
Python使用defaultdict读取文件各列的方法
May 11 Python
python绘制铅球的运行轨迹代码分享
Nov 14 Python
对dataframe数据之间求补集的实例详解
Jan 30 Python
python3实现表白神器
Apr 09 Python
python+openCV利用摄像头实现人员活动检测
Jun 22 Python
python多进程重复加载的解决方式
Dec 13 Python
文件上传服务器-jupyter 中python解压及压缩方式
Apr 22 Python
浅谈keras中Dropout在预测过程中是否仍要起作用
Jul 09 Python
Python爬虫+tkinter界面实现历史天气查询的思路详解
Feb 22 Python
OpenCV3.3+Python3.6实现图片高斯模糊
May 18 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开发的9条建议
2015/07/27 PHP
Yii2中hasOne、hasMany及多对多关联查询的用法详解
2017/02/15 PHP
PHP远程连接oracle数据库操作实现方法图文详解
2019/04/11 PHP
Laravel timestamps 设置为unix时间戳的方法
2019/10/11 PHP
js中巧用cssText属性批量操作样式
2011/03/13 Javascript
获取客户端网卡MAC地址和IP地址实现JS代码
2013/03/17 Javascript
一个简单的JS时间控件示例代码(JS时分秒时间控件)
2013/11/22 Javascript
常用jQuery选择器总结
2014/07/11 Javascript
js获取页面传来参数的方法
2014/09/06 Javascript
JS合并数组的几种方法及优劣比较
2014/09/19 Javascript
详解AngularJS中的作用域
2015/06/17 Javascript
cocos2dx骨骼动画Armature源码剖析(一)
2015/09/08 Javascript
JS实现自动变化的导航菜单效果代码
2015/09/09 Javascript
jquery判断密码强度的验证代码
2020/04/22 Javascript
基于socket.io+express实现多房间聊天
2016/03/17 Javascript
javascript HTML5 canvas实现打砖块游戏
2020/06/18 Javascript
浅析jquery如何判断滚动条滚到页面底部并执行事件
2016/04/29 Javascript
js判断checkbox是否选中个数的方法(超简单)
2016/08/19 Javascript
微信小程序 网络API 上传、下载详解
2016/11/09 Javascript
Windows安装Node.js报错:2503、2502的解决方法
2017/10/25 Javascript
Node.js的Koa实现JWT用户认证方法
2018/05/05 Javascript
让Vue也可以使用Redux的方法
2018/05/23 Javascript
layui+jquery支持IE8的表格分页方法
2019/09/28 jQuery
vue 内联样式style中的background用法说明
2020/08/05 Javascript
[45:17]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第三场 1月9日
2021/03/11 DOTA
Python面向对象类的继承实例详解
2018/06/27 Python
在TensorFlow中屏蔽warning的方式
2020/02/04 Python
pytorch 多分类问题,计算百分比操作
2020/07/09 Python
美国第二大团购网站:LivingSocial
2016/07/24 全球购物
Eastbay官网:美国最大的运动鞋网络零售商
2016/07/27 全球购物
就业推荐表自我鉴定
2013/10/29 职场文书
给校长的建议书100字
2014/05/16 职场文书
阳光体育活动实施方案
2014/05/25 职场文书
火烧圆明园的观后感
2015/06/03 职场文书
2015年科普工作总结
2015/07/23 职场文书
分享mysql的current_timestamp小坑及解决
2021/11/27 MySQL