数据结构之二分查找(折半查找)
数据结构之二分查找(折半查找)
二分查找又称折半查找,优点是次数比较少,查找速度快,平均性能好,其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等即查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则查找后一子表。重复以上过程,直到找到满足条件的记录,便查找成功,或直到子表不存在未知,此时查找不成功。
二分查找算法分析
使用前提:有序、顺序表
最坏的情况就是一直在对半找下去,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))
运行结果:
数据结构之二分查找(折半查找)相关推荐
- 二分查找/折半查找算法
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表 ...
- c语言折半查找输出坐标,数据结构(C语言版)——有序表查找(折半查找)(代码版)...
数据结构(C语言版)--有序表查找(折半查找)(代码版) 数据结构(C语言版)--有序表查找(折半查找)(代码版) #include #include #define ERROR 0 #define ...
- 顺序表查找+折半查找(二级)
我们讲了各种数据 结构之后,比如讲了线性表了,讲了栈和队列,讲了树和二叉树,讲了图之后呢,我们最后还有两个专题,一个叫查找,一个叫排序,我们先看看查找,查找包括哪些内容啊,第一个线性表的查找,数组或者 ...
- c语言指针的折半法查找,数据结构笔记7:折半查找法(二分查找法)及C语言实现...
折半查找,也称二分查找,在某些情况下相比于顺序查找,使用折半查找算法的效率更高.但是该算法的使用的前提是静态查找表中的数据必须是有序的. 折半查找算法 对静态查找表{5,13,19,21,37,56, ...
- Python二分查找/折半查找算法详解--(面试常考)
https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) 二分查找也称折 ...
- swift版 二分查找 (折半查找)
二分查找作为一种常见的查找方法,将原本是线性时间提升到了对数时间范围之内,大大缩短了搜索时间,但它有一个前提,就是必须在有序数据中进行查找.废话少说,直接上代码,可复制粘贴直接出结果! import ...
- 【算法数据结构Java实现】折半查找
1.背景 以一个题目为例,一个整数x是一组按大小顺序排列好的数列中的一个数,我们要找到x在数列中的索引位置. 比如按从小到大排列的数列: -3,-2,0,4,5,7,12,64 我们要找到数字7的位置 ...
- 数据结构折半查找算法C语言,数据结构C语言实现----折半查找
运行结果: 代码如下: #include //数组初始化函数 void Array_get(int array[],int max) { printf("请输入一个数组,大小从低到高,各个数 ...
- C语言数组查找(线性查找 折半查找)
线性查找 #include <stdio.h> #include <math.h>void find_nine(int numbers[]) {int i;for(i = 0; ...
- 顺序查找 折半查找 二叉排序树
1.顺序查找,折半查找,二叉排序树操作定义 SeqSearch.h #include<stdio.h> #define ARRAYLEN 8int source[]={69, 65, 90 ...
最新文章
- Python之print语句Python的注释
- 只学一点点:我的技术学习策略
- 【MySQL】Got fatal error 1236原因和解决方法
- python逻辑运算符不懂_Python运算符之逻辑运算符
- Thinkphp js、css压缩类minify
- 腾讯发布企鹅号“达人计划”清退公告 清退后当月结算将被取消
- .net、mono和C#
- 美团点评技术年货:900+页电子书,覆盖前端、后台、大数据、算法……(附下载链接)...
- visreg:带你玩遍模型可视化
- 整人BAT\VBS代码 自创
- 【机器学习】BP算法推导
- vtiger 安装中文语言包(汉化的步骤)--拓展繁体中文
- java制作摇奖系统_基于Java实现抽奖系统
- 【值得读】自动机器学习: 最新进展综述与开放挑战 | AutoML
- 由pytorch中的super().__init__到python中的测试
- android分辨率比例,选择点一:搞清楚分辨率与屏幕比例
- 「 LaTeX 」写论文,单双栏显示行号
- NET Namespace(1)
- 南京大学计算机考研考试大纲,南京大学计算机技术(专业学位)研究生考试科目和考研参考书目...
- 获取目标RDP登录凭据
热门文章
- 码农新机会!2019-2020行业调查报告出炉,这个领域程序员缺口很大!
- 十步,教你把Python运行速度提升 30%
- 滴滴叶杰平:年运送乘客百亿次,AI如何“服务”出行领域?| BDTC 2019
- 心酸科研路:3年前CVPR论文,仅被引用11次,如今成就黑洞照片!
- Hinton等大牛要来中国授课,首个AI人才国际培养计划在北大启动
- 这位年仅27岁的阿联酋人工智能部长,竟计划2117年火星造城,真是有钱帅气又任性!
- 史上最全的Excel导入导出(easyexcel版)
- 拒绝躺平,Redis选择实现了自己的VM
- 深入理解 Mybatis 插件开发
- Nginx为什么快到根本停不下来?