1.1算法是一组完成任务的指令,任何代码片段都可视为代码。
1.2二分查找:
在一个有序的元素列表(必须有序)。如果要查找的元素包含在列表中,则返回其位置;否则返回null。
工作原理:每次都从列表的中间进行查找,每次都排除一半的数字。
例:在1-100中找到一个我想的数。从50开始,小了,就找50-100之间的数75,大了,就找1-50之间的数25;以此类推,每次减少一半的数字,最终找到想要的数。
100-->50-->25-->13-->7-->4-->2-->1 7步
1.3简单查找。就是傻找,一个一个的按着顺序查找,不漏任何一个数。
简单查找需要n步,而二分查找需要log2n步。
1.4Python代码实现二分查找
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
return None
my_list = [1, 3, 5, 7, 9]
print(binary_search(my_list, 1))
print(binary_search(my_list, -1))
练习.(1).假设有一个包含128个名字的有序列表,使用二分查找需要多少步?
log2128 = 7步
(2).上面列表翻倍后最多需要几步?
log2256 = 8步
1.5运行时间。
设计程序,一般而言应选择效率最高的算法,以最大限度的减少运行时间或占用空间。
简单查找的查找次数和列表长度相同,这被称为线性时间。
二分查找的运行时间为对数时间。
1.6.大O表示法
算法的运行时间以不同的速度增加。
大O表示法指出了算法有多快,即指出了算法运行时间的增速。简单查找运行时间为O(n)。二分查找运行时间为O(log n)。
大O表示法指出了最糟情况下的运行时间。
一些常见的大O运行时间:
O(log n),也叫对数时间,这样的算法包括二分查找。
O(n), 也叫线性时间,这样的算法包括简单查找。
O(n * log n), 这样的算法包括快速排序----一种速度较快的排序算法。
O(n2), 这样的算法包括选择排序----一种速度较慢的排序算法。
O(n!), 一直非常慢的算法,类似旅行商问题的解决方案算法。
练习:
O(logn)
(2).在电话簿中根据电话号码找人。(提示:你必须查找整个电话簿。)
O(n)
(3). 阅读电话簿中每个人的电话号码。
O(n)
(4).阅读电话簿中姓名以A打头的人的电话号码。这个问题比较棘手,它涉及第4章的概念。答案可能让你感到惊讶!
O(n),大O表示法不考虑乘以、除以、加上或减去的
1.7.小结
- 二分查找的速度比简单查找快的多
- O(log n)比O(n)快。需要搜索的元素越多,前者比后者就快的越多。
- 算法运行时间并不以秒为单位
- 算法运行时间是从其增速的角度度量的
- 算法运行时间用大O表示法表示