MIT算法导论公开课之第3课 分治法

分治法

1.  将一个问题划分为若干个子问题。
2.  递归的解决每一个子问题。
3.  将子问题的解合并成为整个大问题的解。

归并排序

1.  将一个数组分为两个子数组。
2.  递归的对每一个子数组进行排序。
3.  合并两个有序子数组。
  • 运行时间
    递归函数为T(n)=2T(n/2)+Θ(n)。
    使用主方法,为case2 ,所以T(n)= Θ(nlgn)。

二分查找

在有序数组中查找数X。
1.  把数X与数组中间元素比较,得到X所在的子数组。
2.  递归的在这个子数组查找X。
3.  无。
  • 运行时间:
    递归函数为T(n)=T(n/2)+Θ(1)。
    使用递归树法T(n)= Θ(lgn)。

乘方问题:

有实数X和正整数n计算X^n。
当n为偶数时,X^n=X^(n/2)·X^(n/2),当n为奇数时,X^n=X^((n-1)/2)·X^((n-1)/2)·X。
  • 运行时间:
    递归函数为T(n)=T(n/2)+Θ(1)。
    使用递归树法T(n)= Θ(lgn)。

斐波那契数列

基本公式法:
    Fn=0           (n=0)
    Fn=1           (n=1)
    Fn=F(n-1)+F(n-2)(n>=2)
    运行时间:
        Ω(φ^n)  φ=(1+5^(1/2))/2。
自下而上递归法:
    依次计算F0,F1,F2 …… Fn。
    运行时间:Θ(n)。
朴素平方递归式:
    Fn=φ^n/5^(1/2)结果取最接近的整数。
    运行时间:Θ(lgn)。
    此算法中的值需用浮点数表示受计算机位数限制。
无法用计算机编码实现。
平方递归式:
    (F(n+1)  Fn)  = (1 1)n
    (Fn  F(n-1))    (1 0)
    运行时间:Θ(lgn)
证明方法可采用归纳法:
1. (F2  F1)  = (1 1)1
   (F1  F0)    (1 0)
2. (F(n+1)  Fn)  = (Fn      F(n-1)) (1 1)
   (Fn  F(n-1))    (F(n-1)  F(n-2)) (1 0)
由定义可知上式成立。

矩阵乘法

  • 输入:两个矩阵A[aij]和B[bij] 1<=i<=n 1<=j<=n
  • 输出:矩阵C[cij]=A[aij]·B[bij]
  • 基本算法:
    • 伪码
    for i ← 1 to n
    do for j ← 1 to n
        cij=0
        do for k ← 1 to n
            do cij ← cij+aik·bkj

    运行时间为Θ(n^3)
  • 矩阵分块法:
    矩阵分块法
  • 斯特拉森(Strassen)算法:
    Strassen算法
    目前最快的理论算法运行时间大约在O(n^2.376)(这个目前指的是网课授课的日期)。

超大规模集成电路(VLSI)布局

假设有一个完全二叉树,在网格上将其放到芯片布局上,有n个叶节点,要在网格上占据最小空间。
  • 朴素算法:
    朴素算法
  • 改进算法:
    改进算法
    Area为Θ(n)。

猜你喜欢

转载自blog.csdn.net/rye_whiskey/article/details/81949200