MITx - 6.00.1x 笔记(6) Algorithmic Complexity

11 计算的复杂性

理解程序运行的效率

关键点:时间内存
选择不同的算法
EvaluateEfficiency

通过计时来评估

不同的机器性能不同,程序运行时间不一,input不同,运行时间也可能不一样
TimingInconsistent

通过计数来评估

不同的进程计数方式不同
CounterEfficiency
NeedABetterWay

  • 评估效率时需要考虑的几点:

    • input中重要的是哪个参数?
    • 考虑最差的情况来评估效率
    • ChooseCases

通过增长级来评估

OrderOfGrowth
通常linearn log n是较好的选择
TypesOfGrowthOrder

Big O Notation(大O符号)

维基解释
上限
BigONotation

1+5n+1 ⇒ O(n)
Steps

Examples

ComplexityOfClasses

分析和计算程序的复杂性
AnalysisComplexity

ExponentialComplexity

ExponentialComplexity2

TrickyComplexity

BigOSummary

ComplexOfCommonPythonFunctions

12 搜索算法和排序算法

搜索算法

线性搜索
  • 穷举搜索
  • 不需要排序
  • LinearSearch
  • O(n)
二分搜索
  • 必须排序
  • O(log n)                             BisectionSearch

  • 方法1:直接复制list,O(n log n)                      BiSearch1

  • 方法2:只改变指针位置而不复制list, O(log n)            BiSearch2

  • TwoBiSearch

  • 何时需要排序

    • SearchSortedList

    • SearchManyTimes

排序算法

猴子排序(Bogo Sort)

MonkeySort
随机摆放位置,检查顺序是否正确,如果不正确,再次随机摆放,直到找到正确的位置
ComplexityOfBogoSort

冒泡排序(Bubble Sort)

两两比较数据, 如果顺序错了,就交换位置
BubbleSort

示意图
冒泡排序示意图

代码实现:

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)

每次都找最小值
SelectionSort
示意图
SelectionSort
代码:

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)

MergeSort

MergeSortAnimation
代码:
MergingStep1
MergingStep2

==>ComplexityOfMergeSort

排序算法小结

SortingSummary

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值