南开大学软件学院2021年秋季学期研究生算法课程(复习)

为什么要学习算法?

在有限时间和内存下,编写程序正确地或有效地解决问题。

计算Fibonacci数列的第n项

算法一:递归函数

int F(int n){
    if(n<=2) return 1;
    return F(n-1)+F(n-2);
}

算法二:递推循环

int F(int n){
    if(n<=2) return 1;
    int f1=1, f2=1;
    for(int i=3;i<=n;i++){
        int temp = f1+f2;
        f1=f2;
        f2=temp;
    }
    return f2;
}

递归函数计算100项时,会无法完成计算,递推可以很快计算出100项。

递归算法的时间复杂度为O(1.618^n),递推函数的时间复杂度为O(n)

算法三:矩阵快速幂算法

数列递推公式的矩阵形式\bigl(\begin{smallmatrix} F_n\\ F_{n-1} \end{smallmatrix}\bigr) = \begin{pmatrix} 1 & 1\\ 1 & 0 \end{pmatrix} \bigl(\begin{smallmatrix} F_{n-1}\\ F_{n-2} \end{smallmatrix}\bigr),数学通项公式的矩阵形式\bigl(\begin{smallmatrix} F_n\\ F_{n-1} \end{smallmatrix}\bigr) = \begin{pmatrix} 1 & 1\\ 1 & 0 \end{pmatrix}^{n-2} \bigl(\begin{smallmatrix} 1\\ 1 \end{smallmatrix}\bigr)

即使有了通项公式,要计算n-2次幂还是需要O(n)时间

快速幂算法

A^n=\left\{\begin{matrix} (A^{\frac{n}{2}})^2,\ n=2k\\ A\times(A^\frac{n-1}{2})^2,\ n=2k+1 \end{matrix}\right.

每次迭代问题规模减半,时间复杂度O(log n)

class Matrix{
    Matrix operator*(const Matrix &);
    // ...
};

Matrix Quickpow(Matrix A, int n){
    if(n==1) return A;
    Matrix half = Quickpow(A, n/2);
    if(n%2==1){
        return A*half*half;
    }else{
        return half*half;
    }
}

int F(int n){
    if(n<=2) return 1;
    Matric A(1,1,1,0);
    A = Quickpow(A,n-2);
    return A[0][0] + A[0][1];
}

当数据规模更大时,O(log n)能比O(n)快得更多

为什么学习算法

  • 根据数据规模选择恰当时间复杂度的算法是很重要的
  • 本课程会介绍更多的方法和思想来优化时间复杂度,矩阵快速幂算法就是分治思想的一个经典应用
  • 优化时间复杂度带来的效率提升往往是显著的,但是设计出新的低复杂度算法难度非常高的
  • 需要澄清的是,程序的实际运行时间不仅仅由算法的时间复杂度决定的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值