男朋友推荐了《算法图解》这本萌萌的书作为我的算法启蒙书,简单翻了翻,似乎对新手很友好的样子,而且使用语言也是我最近正在学习的Python。既然决定了要走技术路线,就要好好学习数据结构与算法呀~~~
Chapter1 算法简介
算法是一组完成任务的指令。
1. 二分查找:
二分查找是一种算法,其输入是一个有序的元素列表。如果要查找的元素包含在列表中,二分查找返回其位置;否则返回null。
注意:仅当列表是有序的时候,二分查找才管用。
- Q:如果名字不是按顺序排列的,结果将如何呢?
- Q:二分查找算法中,当中位数不是整数时,是向上取整还是向下取整?(https://cloud.tencent.com/developer/article/1434845)
- 对于有n个元素的有序列表:
简单查找:最多需要n步(线性时间)
二分查找:最多需要logn步(对数时间)
- Python实现:
书里面的代码是基于Python2.7版本的,我自己运行的时候使用的是3.7版本。
# binary search algorithm
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
elif guess > item:
high = mid - 1
else:
low = mid + 1
my_list = range(1,101)
print(binary_search(my_list,3)) # element "3" is at index 2
print(binary_search(my_list,-1)) # result:None
2. 大O表示法:
大O表示法是一种特殊的表示法,指出了算法的速度有多快。
算法的运行时间以不同的速度增加——
假设每检查一个元素需要1毫秒:
简单查找 | 二分查找 | |
---|---|---|
100个元素 | 100ms | 7ms |
10000个元素 | 10000ms | 14ms |
1000000000个元素 | 1000000000ms | 32ms |
(观察:随着列表的增长,二分查找的速度比简单查找快得多。)
有鉴于此,仅知道算法需要多长时间才能运行完毕还不够,还需知道运行时间如何随列表增长而增加。这正是大O表示法的用武之地。
大O表示法指出了最糟情况下的运行时间
・用大O法表示运行时间:
简单查找:O(n)
二分查找:O(logn)
注意:除最糟情况下的运行时间外,还应考虑平均情况的运行时间,这很重要。
- 启示:
・ 算法的速度指的并非时间,而是操作数的增速。
・谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加。
・算法的运行时间用大O表示法表示。
・O(log n)比O(n)快,当需要搜索的元素越多时,前者比后者快得越多。
- “阅读电话簿中姓名以A打头的人的电话号码”,运行时间是多少?(O(n) - ref.本书4.3节)
3. 旅行商:
问题:旅行商要前往n个城市,同时要确保旅程最短,怎样制定方案?
算法:考虑前往这些城市的各种可能顺序,对于每种顺序都计算总旅程,再挑选出旅程最短的路线。
运行时间: O(n!)
旅行商问题是计算机科学领域待解的问题之一。对于这个问题,目前还没有找到更快的算法。面对这个问题,我们能做的只是去找出近似答案。
(更详细的信息请参阅第10章)
@ 小结:
- 二分查找的速度比简单查找快得多。
- O(log n)比O(n)快。需要搜索的元素越多,前者比后者就快得越多。
- 算法运行时间并不以秒为单位。
- 算法运行时间是从其增速的角度度量的。
- 算法运行时间用大O表示法表示。