算法图解(二分查找)
前言:
今天是第一篇 以后尽量每天写 看具体时间安排吧 目前一边学Python、Java、Go还有算法 所以写的比较少
主要是Python一天差不多16小时吧 Java、go看时间安排 这次算法全是用Python演示的 不懂Python的也没关系
或者可以看一下我前面的帖子
算法是什么:
算法是一只组完成任务的指令 要么速度快、要么能解决问题
应该说是为实现某些目的的逻辑 以及 思想 的代码
二分查找
假设你要查找电话本里k开头的人 里可能会直接滑动到中间 因为你知道k在中间位置
因为电话本是abcdef排序的嘛
定义:
二分查找就指从中间开始查找的逻辑做法
注:
# 二分查找必须是有序序列 返回其位置
# 无序无法进行二分查找 返回null
例如:
二分查找:
利用二分查找每次取中间数 有小数可以向上或向下取整数
100以内的数字 最多7次可以找出来
普通查找:
而普通查找则是从头到位遍历最好的情况是1 一次找出
最差是100次
二分查找随着元素的增加并不会改变太大
普通查找则会随元素的增加而增加
比如说一个字典内有240000个单词
普通查找最差情况:240000次 出结果
二分查找最差情况:17次出结果
这就很明显的突出了二分算法的优势
####这里我用()括号里的数字代表log的下标
用二分查找最多需要log(2)n步
其实就是利用对数运算:
对数运算:
定义: 幂运算的逆运算
例如:
10**2 = 100 log(10)100 = 2
10**3 = 1000 log(10)1000=3
2**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 = 0 high = len(lst) - 1 while low <= high: mid = round((low + high) / 2) guess = lst[mid] if guess == item: # 猜对了 return mid if guess > item: high = mid - 1 # 猜大了 else: low = mid + 1 # 猜小了 return None my_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表示法表示