图解算法笔记1 - 二分查找 & 大O表示法(时间复杂度)
图解算法笔记1 - 二分查找 & 大O表示法(时间复杂度)
算法是计算机科学的核心,而二分查找和大O表示法则是理解算法效率的关键概念。本文将通过直观的图解和简洁的代码示例,帮助你快速掌握这两个重要的算法基础知识。
1、由二分查找引出时间概念
二分查找是一种算法,其输入是一个有序的元素列表(必须有序)。如果要查找的元素包含在列表中,二分查找返回其位置,否则返回NULL。
一般而言,对于包含n个元素的列表,用二分查找最多需要log 2 n \log_2 nlog2 n步,而简单查找最多需要n步。
例如:如果列表包含8个元素,简单查找需要检查8个元素,二分查找只需要检查3个元素,因为2 3 2^323=8。
1.1 python实现二分查找
def binary_search(list_demo, item):
low = 0
high = len(list_demo) - 1
while low <= high:
mid = (low + high) // 2
guess = list_demo[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))
print(binary_search(my_list,-1))
由此可见,二分查找的运行时间为对数时间(或log时间)。
2、大O表示法
大O表示法是一种特殊的表示法,指出了算法的速度有多快。
例如,假设列表包含n个元素。简单查找需要检查每个元素,因此需要执行n次操作。使用大O表示法,这个运行时间为O(n)。
大O表示法能够比较操作数,它指出了算法运算时间的增速。同时,大O表示法指出了算法在最糟情况下的运算时间。
2.1 一些常见的大O运行时间
下面按从快到慢的顺序列出了常见的5种大O运行时间:
O(l o g n log nlogn),也叫对数时间,这样的算法包括二分查找。
O(n nn),也叫线性时间,这样的算法包括简单查找。
O(n l o g n nlognnlogn),这样的算法包括快速排序,一种速度较快的排序算法。
O(n 2 n^2n2),这样的算法包括选择排序,一种速度较慢的排序算法。
O(n ! n!n!),这样的算法包括下面要介绍的旅行商问题的解决方案,一种非常慢的算法。
假设你要绘制一个包含16格的网格,且有5种不同的算法可供选择,这些算法的运行时间如图所示:
2.2 旅行商问题
有一个旅行商:
他需要前往5个城市。
这位旅行商要前往5个城市,同时确保旅程最短,为此,可考虑的城市顺序如下:
对于每种顺序,都需计算总旅程,再挑选最短的路线。5个城市有5!个排列方式,6个城市有6!个排列方式,以此类推,涉及n nn个城市时,需要n ! n!n!次操作才能计算出结果。
2.3 小结:
1)算法的速度指的并非时间,而是操作数的增速。
2)谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加。
3)算法的运行时间用大O表示法表示。
4)O(l o g n lognlogn)比O(n nn)快,当需要搜索的元素越多时,前者比后者快得越多。
5)算法运行时间并不以秒为单位。