提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
算法图解笔记 第一章
前言
本章内容
为阅读后续内容打下基础。
编写第一种查找算法——二分查找。
学习如何谈论算法的运行时间——大O表示法。
了解一种常用的算法设计方法——递归。
1.1 引言
算法是一组完成任务的指令,任何代码片段都可视为算法。
1.2 二分查找
二分查找是一种算法,其输入是一个有序的元素列表(必须有序的原因稍后解释)。如果要查找的元素包含在列表中,二分查找返回其位置;否则返回null
。
注:仅当列表是有序的时候,二分查找才管用
1.2.1 二分法在有序数组中查找元素
def binary_search(list,item):
low = 0
high = len(list)-1
while low<=high:
mid = (low+high)//2
guess = list[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_search(my_list,3))
# 二分查找非递归法
# 在python中
# " / "表示浮点数除法,返回浮点结果;
# " // "表示整数除法。
# 在本文中当数组的长度为奇数时,mid由(low+high)//2 向下取整。
1.2.2 二分查找的优缺点
-
虽然二分查找的效率高,其花费时间为O(lgn)但是要将表按关键字排序。而排序本身是一种很费时的运算。既使采用高效率的排序方法也要花费O(nlgn)的时间。
-
二分查找只适用顺序存储结构。为保持表的有序性,在顺序结构里插入和删除都必须移动大量的结点。因此,二分查找特别适用于那种一经建立就很少改动、而又经常需要查找的线性表。
-
对那些查找少而又经常需要改动的线性表,可采用链表作存储结构,进行顺序查找。链表上无法实现二分查找。
1.3 大O表示法
大O表示法是一种特殊的表示法,指出了算法的速度有多快。
1.3.1 常见的大O运行时间:
-
O(log n) ,也叫对数时间,这样表示的算法包括二分查找。
-
O(n) ,也叫线性时间,这样的算法包括简单查找。
-
O(n * log n) ,这样的算法包括快速排序。
-
O(n^{2}), 这样的算法包括选择排序。
-
O( n! ),这样的算法包括旅行商的解决方案。
1.3.2 关于大O运行时间的小结:
- 算法的速度指的并非时间,而是操作数的增速。
- 谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加。
- 算法的运行时间用大O表示法表示。
- O(log n)比O(n)快,当需要搜索的元素越多时,前者比后者快得越多。
1.4课后练习
1、练习 (P8)
1.1 假设有一个包含128个名字的有序列表,你要使用二分查找法在其中查找一个 名字,请问最多需要几步才能找到?
128->64->32->16->8->4->2->1,所以最多需要7步。
1.2上面列表的长度翻倍之后,最多需要几步?
翻倍后顶多会增加一步,所以是8步。
1、练习 (P13)
使用大O表示法给出下属各种情况的运行时间
1.3 在电话簿中根据名字查找电话号码。
根据字母姓式二分查找所用时间为:O(log n)
1.4 在电话簿中根据电话号码找人。(提示:你必须查找整个电话簿。)
简单查找,所用时间为:O(n)
1.5 阅读电话簿中每个人的电话号码
简单查找,所用时间为:O(n)
1.6阅读电话簿中姓名以A打头的人的电话号码。
总结
- 二分查找的速度比简单查找快得多。
- O(log n)比O(n)快。需要搜索的元素越多,前者比后者就快得越多。
- 算法运行时间并不以秒为单位。
- 算法运行时间是从其增速的角度度量的。