《算法图解》学习笔记-第一章-算法简介
文章目录
前言
本文为自己的算法学习笔记,用来将所学知识及时输出
所用书籍:《算法图解》
1.1 什么是算法
算法是一组完成任务的指令。任何代码片段都可视为算法。
算法的定义:计算机按照一定规则解决一类问题的明确和有限的步骤
1.2 二分查找法
二分查找和小时候玩的猜数字游戏有些类似,玩家A在一组数字中任选一个数字,由玩家B去猜测,怎样才能最快的去猜到这个数字,这就和二分查找的思想有关了。
假设共有100个数字,由1-100正序排列,玩家B第一次猜测数字为100/2=50,玩家A回答大了或者小了,若大了玩家B下一次猜测数字为50/2=25,若小了数字为50+(100-50)/2 = 75,由此类推直到找到正确数字。
注:二分查找的输入需是一组有序的元素列表,若要查找的元素包含在此列表中,结果返回元素索引,否则返回null。
二分查找的python实现
代码如下:
def binary_search(ls, item): # ls为数字列表(数组),item为要猜测的数字
low = 0 # low和high用来跟踪查找列表范围
high = len(ls) - 1
while low <= high: # 直至范围缩小到只包含一个元素
mid = (low + high) // 2 # 获取列表中部索引
guess = ls[mid] # 取得对应的值
if guess == item: # 猜对了返回值的索引
return mid
elif guess < item: # 猜小了
low = mid + 1
else: # 猜大了
high = mid - 1
return None # 列表未包含指定元素
list = [] # 测试
for i in range(100):
list.append(i+1) # 生成[1, 2, 3, ..., 100]
print(binary_search(list, 2)) # => 1
print(binary_search(list, -2)) # => None
1.3 大O表示法
大O表示法指出了算法的速度快慢,可以帮助编程人员衡量算法的好坏。
1.3.1 不同算法运行时间也不尽相同
假设列表包含n个元素,用从头找到尾的简单查找法,最多需要找n次,而使用二分查找法,在最糟糕的情况下也只需要找log2n次,下面具体对比一下:
元素个数 | 简单查找 | 二分查找 |
100 | 100毫秒 | 7毫秒 |
10,000 | 10秒 | 14毫秒 |
1000,000,000 | 11天 | 30毫秒 |
1.3.2 常见的大O运行时间
下面是由快到慢的五种常见大O运行时间
- O(log n), 对数时间, 算法包括二分查找
- O(n),线性时间, 算法包括简单查找
- O(n * log n),算法包括快速排序-------第四章
- O(n²),算法包括选择排序-------第二章
- O(n!),旅行商问题
1.3.3 旅行商问题
旅行商问题的算法运行时间为O(n!),且暂无更好的解决方法。具体问题如下:
有一名旅行商,他要去5个城市,同时要保证旅程时间最短,为此需要考虑前往这些城市的顺序搭配。
五个城市有120种不同的解决方案,因此需要执行120次操作。涉及6个城市时,需要执行720次操作。而如果有n个城市,则需执行n!次操作才能得出结果,因此运行时间为O(n!)。
总结
- 不同算法运行时间不同,尽量选择最优算法。
- 简单查找最糟情况下需要遍历全部元素,因此运行时间为O(n)。
- 二分查找法每次除去当前范围一半的数据量,因此运行时间为O(log n)。
- 大O表示法用来衡量算法运行时间,帮助程序员判断算法优劣。