数据结构之二分查找(折半查找)

二分查找又称折半查找,优点是次数比较少,查找速度快,平均性能好,其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等即查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则查找后一子表。重复以上过程,直到找到满足条件的记录,便查找成功,或直到子表不存在未知,此时查找不成功。

二分查找算法分析

使用前提:有序、顺序表

最坏的情况就是一直在对半找下去,2的m次幂(m即查找次数)为n(总长),即时间复杂度m为O(logn);最好的情况就是首次就找到,即O(1)

二分查找算法实现

示例代码1:

def binary_search(li, item):"""二分查找"""n = len(li)mid = n // 2if n > 0:if li[mid] == item:return Trueelif li[mid] > item:return binary_search(li[:mid], item)else:return binary_search(li[mid + 1:], item)return Falseif __name__ == '__main__':li = [17, 20, 26, 31, 44, 50, 54, 77, 93]result1 = binary_search(li, 20)print(result1)result2 = binary_search(li, 78)print(result2)

运行结果:

示例代码2:

#  非递归
def binary_search(li, item):"""二分查找"""n = len(li)first = 0end = n - 1while first <= end:mid = (first + end) // 2if li[mid] == item:return Trueelif li[mid] > item:end = mid - 1else:first = mid + 1return Falseif __name__ == '__main__':li = [17, 20, 26, 31, 44, 50, 54, 77, 93]result1 = binary_search(li, 20)print(result1)result2 = binary_search(li, 78)print(result2)

运行结果:

比较上面两种算法是运算速度:

示例代码:

from timeit import Timer#  递归
def binary_search(li, item):"""二分查找"""n = len(li)mid = n // 2if n > 0:if li[mid] == item:return Trueelif li[mid] > item:return binary_search(li[:mid], item)else:return binary_search(li[mid + 1:], item)return False#  非递归
def binary_search2(li, item):"""二分查找"""n = len(li)first = 0end = n - 1while first <= end:mid = (first + end) // 2if li[mid] == item:return Trueelif li[mid] > item:end = mid - 1else:first = mid + 1return Falseif __name__ == '__main__':li = [17, 20, 26, 31, 44, 50, 54, 77, 93]print('查找成功情况下:')time1 = Timer('binary_search([17, 20, 26, 31, 44, 50, 54, 77, 93], 20)', 'from __main__ import binary_search')print('recursion running time:', time1.timeit(10))time2 = Timer('binary_search2([17, 20, 26, 31, 44, 50, 54, 77, 93], 20)', 'from __main__ import binary_search2')print('non-recursion running time:', time2.timeit(10))print('查找失败情况下:')time3 = Timer('binary_search([17, 20, 26, 31, 44, 50, 54, 77, 93], 78)', 'from __main__ import binary_search')print('recursion running time:', time3.timeit(10))time4 = Timer('binary_search2([17, 20, 26, 31, 44, 50, 54, 77, 93], 78)', 'from __main__ import binary_search2')print('non-recursion running time:', time4.timeit(10))

运行结果:

数据结构之二分查找(折半查找)相关推荐

  1. 二分查找/折半查找算法

    二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表 ...

  2. c语言折半查找输出坐标,数据结构(C语言版)——有序表查找(折半查找)(代码版)...

    数据结构(C语言版)--有序表查找(折半查找)(代码版) 数据结构(C语言版)--有序表查找(折半查找)(代码版) #include #include #define ERROR 0 #define ...

  3. 顺序表查找+折半查找(二级)

    我们讲了各种数据 结构之后,比如讲了线性表了,讲了栈和队列,讲了树和二叉树,讲了图之后呢,我们最后还有两个专题,一个叫查找,一个叫排序,我们先看看查找,查找包括哪些内容啊,第一个线性表的查找,数组或者 ...

  4. c语言指针的折半法查找,数据结构笔记7:折半查找法(二分查找法)及C语言实现...

    折半查找,也称二分查找,在某些情况下相比于顺序查找,使用折半查找算法的效率更高.但是该算法的使用的前提是静态查找表中的数据必须是有序的. 折半查找算法 对静态查找表{5,13,19,21,37,56, ...

  5. Python二分查找/折半查找算法详解--(面试常考)

    https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究)   二分查找也称折 ...

  6. swift版 二分查找 (折半查找)

    二分查找作为一种常见的查找方法,将原本是线性时间提升到了对数时间范围之内,大大缩短了搜索时间,但它有一个前提,就是必须在有序数据中进行查找.废话少说,直接上代码,可复制粘贴直接出结果! import ...

  7. 【算法数据结构Java实现】折半查找

    1.背景 以一个题目为例,一个整数x是一组按大小顺序排列好的数列中的一个数,我们要找到x在数列中的索引位置. 比如按从小到大排列的数列: -3,-2,0,4,5,7,12,64 我们要找到数字7的位置 ...

  8. 数据结构折半查找算法C语言,数据结构C语言实现----折半查找

    运行结果: 代码如下: #include //数组初始化函数 void Array_get(int array[],int max) { printf("请输入一个数组,大小从低到高,各个数 ...

  9. C语言数组查找(线性查找 折半查找)

    线性查找 #include <stdio.h> #include <math.h>void find_nine(int numbers[]) {int i;for(i = 0; ...

  10. 顺序查找 折半查找 二叉排序树

    1.顺序查找,折半查找,二叉排序树操作定义 SeqSearch.h #include<stdio.h> #define ARRAYLEN 8int source[]={69, 65, 90 ...

最新文章

  1. Python之print语句Python的注释
  2. 只学一点点:我的技术学习策略
  3. 【MySQL】Got fatal error 1236原因和解决方法
  4. python逻辑运算符不懂_Python运算符之逻辑运算符
  5. Thinkphp js、css压缩类minify
  6. 腾讯发布企鹅号“达人计划”清退公告 清退后当月结算将被取消
  7. .net、mono和C#
  8. 美团点评技术年货:900+页电子书,覆盖前端、后台、大数据、算法……(附下载链接)...
  9. visreg:带你玩遍模型可视化
  10. 整人BAT\VBS代码 自创
  11. 【机器学习】BP算法推导
  12. vtiger 安装中文语言包(汉化的步骤)--拓展繁体中文
  13. java制作摇奖系统_基于Java实现抽奖系统
  14. 【值得读】自动机器学习: 最新进展综述与开放挑战 | AutoML
  15. 由pytorch中的super().__init__到python中的测试
  16. android分辨率比例,选择点一:搞清楚分辨率与屏幕比例
  17. 「 LaTeX 」写论文,单双栏显示行号
  18. NET Namespace(1)
  19. 南京大学计算机考研考试大纲,南京大学计算机技术(专业学位)研究生考试科目和考研参考书目...
  20. 获取目标RDP登录凭据

热门文章

  1. 码农新机会!2019-2020行业调查报告出炉,这个领域程序员缺口很大!
  2. 十步,教你把Python运行速度提升 30%
  3. 滴滴叶杰平:年运送乘客百亿次,AI如何“服务”出行领域?| BDTC 2019
  4. 心酸科研路:3年前CVPR论文,仅被引用11次,如今成就黑洞照片!
  5. Hinton等大牛要来中国授课,首个AI人才国际培养计划在北大启动
  6. 这位年仅27岁的阿联酋人工智能部长,竟计划2117年火星造城,真是有钱帅气又任性!
  7. 史上最全的Excel导入导出(easyexcel版)
  8. 拒绝躺平,Redis选择实现了自己的VM
  9. 深入理解 Mybatis 插件开发
  10. Nginx为什么快到根本停不下来?