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)
 
 
代码: 
 
==>
排序算法小结
 
                    
                     
                    
                 
                    
                

 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号