zoukankan      html  css  js  c++  java
  • MIT公开课:算法导论 笔记(一)

    课程链接:http://open.163.com/special/opencourse/algorithms.html

    第一课:算法分析基础

    1.介绍插入排序与归并排序,计算并比较最坏运行时间

    2.算法分析重点与渐近分析方法

    以下为个人笔记,根据字幕整理


    第一课 算法分析
    总结 解决问题的方法和方式
    算法:关于计算机程序性能和资源利用的研究

    算法:性能、速度

    在程序设计方面,什么比性能更重要呢?
      正确性,可维护,健壮性
      模块化,安全,用户友好

    为什么关注性能?
    1.直接决定方法可行不可行
      算法能将不可行变为可行
    2.算法是一种描述程序行为的语言
      思考程序的最简洁方式

    性能是支付其他东西的“货币”
    安全 用户友好 健壮性
        |         | |           |
               性能
    衡量代价的一般标准

    为什么关注速度?
    追求速度是人的天性

    、、、、、、、、、、、、、、

    排序算法

    排序问题的一般描述
    输入:序列 a1, a2, a3, ..., an
    按需求重新排序
    输出:序列 b1, b2, b3, ..., bn

    1.插入排序

    伪代码描述:
    理解算法要描述的意思,简洁
    使用缩进表示嵌套

    按照升序排列

    for j<- 2 to n
      do key<- A[j] //从数组A中取值
      i<- j-1
      while i>0 and A[i]> key //前向查找较大值
        do A[i+1]<- A[i]
        i<- i-1 //i递减至0
      A[i+1]<- key


    实例 8 2 4 9 3 6
    一次 2 8 4 9 3 6
    二次 2 4 8 9 3 6
    三次 2 4 8 9 3 6
    四次 2 3 4 8 9 6
    五次 2 3 4 6 8 9


    最坏情况分析
    最大占首位,最小占末位

    操作数计数:内存引用计数
    T(n) = sum _{2->n}( theta(j) )
    算术级数 theta(n^2)

    小规模n 快速
    大规模n 慢
    、、、、、、、、、、、、、、、、、、、、、、、、、、


    程序分析:
    1.运行时间
    输入是否有序
    输入规模
    运行时间上界:对用户的承诺

    最关注:
    最坏情况分析
    T(n) 输入规模为n时的运行时间上界
    平均情况分析
    T(n) 输入规模为n时,运行时间的期望值

    算法的大局观
    1.算法涉及诸多领域
    2.解决复杂问题

    渐近分析
    1.忽略依赖于机器的常量
    2.关注运行时间的增长,而不是运行时间

    相对速度 绝对速度

    渐近符号
    theta符号函数
    theta(n) = 3n^2 + 9n^2 + 5n
    去掉常数项、低阶项

    数学的严谨,工程的直觉
    在两者间找到一种平衡,较好的算法

    低速算法
    当输入规模在合理范围时,运行速度较快

    、、、、、、、、、、、、、、、、、、、、、、、、、、、

    归并排序
    if n==1 done
    else recursively sort
      A[1 ... celi(n/2) ] //ceil向上取整
      A[ celi(n/2)+1 ... n ]
    last merge 2 sub sorted list

    归并子程序

    两个子排序结果:
    list[1] 20 13 7 2
    list[1] 12 11 9 1

    遍历与归并时间
    T(n)

    递归式
    n=1 T(n)=theta(1)
    n>1 T(n)=2T(n/2)+theta(n)
    -----------------------
    如何求解递归式?
    -----------------------
    递归树
    T(n)
    T(n/2) T(n/2)
    T(n/4) ... T(n/4)
    ... ...
    T(1)  ... ... T(1)

    计算量
    C(n)
    C(n/2) C(n/2)
    C(n/4) C(n/4)
    ... ...
    C(1)  ... ... C(1)

    高度 log(n)
    叶节点数目 n
    计算量

    cn*log(n) + theta(n)
    =theta(n*log(n))

    as long as you are rigorous and precise,
    you can be as sloppy as you want.
    只要你严格而精确,可以略去任意细节

  • 相关阅读:
    Linux文件编辑器 vi
    Sudo 和 Root 帐号
    Linux基本命令篇的习题解答
    Linux应用篇
    VMware中虚拟机网卡的四种模式
    Ubuntu游戏集合
    Linux与Window文件共享
    Linux知识点滴II
    [转载][翻译]jQuery Mobile教程创建一个订餐web应用(下)
    在WPF中创建带有刻度线的滑动条
  • 原文地址:https://www.cnblogs.com/feinaio2017/p/8098545.html
Copyright © 2011-2022 走看看