3.26《算法图解》笔记——Chapter 1 Binary Search

本文是《算法图解》一书中Chapter 1关于二分查找的笔记。二分查找适用于有序列表,通过每次排除一半元素的方式在log2n步内找到目标,相比简单查找的线性时间复杂度O(n),二分查找的时间复杂度为O(logn)。文中还介绍了大O表示法,用于描述算法的运行速度,如O(n)、O(logn)等,并提到了不同时间复杂度的排序算法。
摘要由CSDN通过智能技术生成

算法图解笔记——Chapter 1 binary search
Author: Seven Zou
Email: zoushiqi0404@gmail.com
Language: Python2.7


1.2 二分查找

二分查找是一种算法,其输入是一个有序的元素列表(必须有序的原因稍后解释)。 例如:查找1—100的数字 目标是以最少的次数猜到这个数字。每次猜测后,三种结果:大了、小了、对了。

  • 1.假设从1往上猜 猜到99:
    - 1…
    - 2…
    - 3…
    - …每次只能猜测一个数字。
  • 2.而如果从50开始猜:
    - 50 -> 小了(排除了一半的数字)
    - 75 -> 大了(又排除了一半)
    - 63 -> 大了(又排除了一半)
    - 57 -> 对了

一般而言,对于包含n个元素的列表,用二分查找最多需 l o g 2 n log_2^n log2n,而简单查找最多需要n步
Note:仅当列表是有序的时候,二分查找才管用。例如,电话簿中的名字是按字母顺序排列的,因此可以使用二分查找来查找名字。如果名字不是俺顺序排列的,结果将会如何呢

编写执行二分查找的Python代码。实例中使用了数组(后序介绍)
e.g. 可将一系列元素存储在一系列相邻的桶(bucket),即数组中。这些桶从0开始编号:

  • 第一个桶的位置为#0,
  • 第二个桶的位置为#1,
  • 第三个桶为#2,
    以此类推 。

函数binary_search接受一个有序数组和一个元素。如果指定的元素包含在数组中,这个函数将返回其位置。你将跟踪要在其中查找的数组部分——开始时为整个数组。

#-*- coding: utf-8 -*-     
def binary_search(list, item):  # list数据包,目标元素item 注意写函数开头不能为数字,必须带冒号:     
	low = 0  # 低索引     
	high = len(list) - 1  # low和high用于跟踪要在其中查找的列表部分 | 高索引为 len - 1(初始低索引为0)     
	while low <= high:  # 只要范围没有缩小到之包含一个元素         
		# mid = (low +high)         
		mid = int((low + high) / 2)  # 就检查中间的元素 (书中错误,已更正)         
		guess = list[mid]   # 获取中间元素         
		if guess == item:  # 找到了元素 guess 即为 目标元素 item 则返回 索引 mid             
			return mid         
		if guess > item:  # 猜的数字大了 将高索引更改为 mid - 1             
			high = mid - 1         
		else:  # 猜的数字小了 将低索引更改为 low + 1             
			low = mid + 1     
	return None  # 没有指定的元素   

# Test
my_list = [1, 3, 5, 7, 9]  
print(binary_search(my_list, 3))  # => 1 别忘了索引从0开始,第二个位置的索引为1 
print(binary_search(my_list, -1))  # => None 在python中,None表示空,它意味着没有找到指定的元素 

1.3 大O表示法

大O表示法指出了算法有多快。例如,假设列表包含n个元素。简单查找需要检测每个元素,因此需要执行n次操作。使用大O表示法,这个运行实际为 O(n)。大O表示法指的并非以秒为单位的速度。

  • 对数时间 O ( l o g n ) O(log^n) O(logn)——i.e.二分查找
  • 线性时间 O ( n ) O(n) O(n)——i.e.简单查找
  • O ( n × l o g n ) O(n \times log^n) O(n×logn), 一种速度较快的排序算法
  • O ( n 2 ) O(n^2) O(n2), 一种速度较慢的排序算法
  • O ( n ! ) O(n!) O(n!), 一种非常慢的算法——i.e.旅行商问题

Reference

[美]Aditya Bhargava/袁国忠, 算法图解, 北京:人民邮电出版社, 2017.3.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值