二分查找.PPT
- 格式:ppt
- 大小:921.50 KB
- 文档页数:15
算法图解(⼆分查找)⼆分查找假设你要查找电话本⾥k开头的⼈⾥可能会直接滑动到中间因为你知道k在中间位置因为电话本是abcdef排序的嘛定义:⼆分查找就指从中间开始查找的逻辑做法注:# ⼆分查找必须是有序序列返回其位置# ⽆序⽆法进⾏⼆分查找返回null例如:⼆分查找: 利⽤⼆分查找每次取中间数有⼩数可以向上或向下取整数 100以内的数字最多7次可以找出来普通查找: ⽽普通查找则是从头到位遍历最好的情况是1 ⼀次找出最差是100次⼆分查找随着元素的增加并不会改变太⼤普通查找则会随元素的增加⽽增加⽐如说⼀个字典内有240000个单词普通查找最差情况:240000次出结果⼆分查找最差情况:17次出结果这就很明显的突出了⼆分算法的优势####这⾥我⽤()括号⾥的数字代表log的下标⽤⼆分查找最多需要log(2)n步其实就是利⽤对数运算:对数运算:定义:幂运算的逆运算例如:10**2 = 100 log(10)100 = 210**3 = 1000 log(10)1000=32**5 = 32 log(2)32 = 5如果有8个元素你最多需要查找3次因为long8 = 3(2**3=8)1024个元素最多需要检查10个元素因为 1024 = 10(2**10=1024)def binary(lst, item):low = 0high = len(lst) - 1while low <= high:mid = round((low + high) / 2)guess = lst[mid]if guess == item: # 猜对了return midif guess > item:high = mid - 1 # 猜⼤了else:low = mid + 1 # 猜⼩了return Nonemy_list = [1, 3, 5, 7, 9]print(binary(my_list, 3)) # 1 返回的元素下标索引是0开始的print(binary(my_list, -1)) # None 因为不存在-1元素运⾏时间: 线性时间(linear time) 100个数字最多猜100次 40亿猜40亿次最多猜的次数等于列表的长度 对数时间(或log时间) 100个数字最多猜7次 40亿猜32次⼤O表⽰法: 简单查找每个元素需要n次运⾏时间为O(n) ⼆分查找运⾏时间为O(log(n))⼤O表⽰法计算的是操作数 O(log n)对数时间包括⼆分查找 O(n)线性时间 O(n * log n)快速排序算法 O(n**2)速度较慢排序法算法 O(n!)⾮常慢的算法⼩结: ⼆分查找⽐简单查找快的多 O(log n)⽐O(n)快,需要搜索的元素越多,前者⽐后者就快的越多 算法运⾏时间并不以秒为单位 算法运⾏时间是从其增速的⾓度度量的 算法的运⾏时间⽤⼤O表⽰法表⽰。