MITx - 6.00.1x 笔记(6) Algorithmic Complexity
11 计算的复杂性
理解程序运行的效率
关键点:时间和内存
选择不同的算法
通过计时来评估
不同的机器性能不同,程序运行时间不一,input不同,运行时间也可能不一样
通过计数来评估
不同的进程计数方式不同
-
评估效率时需要考虑的几点:
- input中重要的是哪个参数?
- 考虑最差的情况来评估效率
通过增长级来评估
通常linear和n log n是较好的选择
Big O Notation(大O符号)
维基解释
上限
1+5n+1 ⇒ O(n)
分析和计算程序的复杂性
12 搜索算法和排序算法
搜索算法
线性搜索
- 穷举搜索
- 不需要排序
- O(n)
二分搜索
- 必须排序
-
O(log n)
-
方法1:直接复制list,O(n log n)
-
方法2:只改变指针位置而不复制list, O(log n)
-
何时需要排序
排序算法
猴子排序(Bogo Sort)
随机摆放位置,检查顺序是否正确,如果不正确,再次随机摆放,直到找到正确的位置
冒泡排序(Bubble Sort)
两两比较数据, 如果顺序错了,就交换位置
示意图
代码实现:
def bubble_sort(L):
swap = False
while not swap: # flag为False时循环
swap = True
for j in range(1, len(L)):
if L[j-1] > L[j]:
swap = False # 只要需要顺序仍然有错,flag就一直是False
temp = L[j]
L[j] = L[j-1]
L[j-1] = temp
==> O(len(L))
选择排序(Selection Sort)
每次都找最小值
示意图
代码:
def selection_sort(L):
suffixSt = 0
while suffixSt != len(L): # O(len(L))
# 每次选定suffixSt的位置,依次和其余数据比较,较小的数据留在suffixSt位置上
for i in range(suffixSt, len(L)): # len(L)-suffixTimes -> O(len(L))
if L[i] < L[suffixSt]:
L[suffixSt], L[i] = L[i], L[suffixSt]
suffixSt += 1
O(n)∗O(n)=O(n2),n=len(L)
归并排序(Merge Sort)
代码:
==>
排序算法小结