算法分析基础(一)

算法的时间复杂度

算法的概念想必大家要么不知道, 要么烂熟于心, 感兴趣的百度一下, 其实我觉得不是那么重要(只是我觉得), 只要会计算算法的复杂度就可以了(这部分我认为相当重要)

概念
  • 算法的时间复杂度: 针对指定基本运算, 计数算法所做运算次数

  • 基本运算: 比较, 加法, 乘法, 交换, 置指针……

  • 输入规模: 输入串编码长度通常用下述参数度量: 数组元素个数, 调度问题的任务个数, 图的顶点数与边数等.

  • 算法基本运算次数可以表示为输入规模的函数

  • 给定问题和基本运算就决定了一个算法类

输入规模
  • 排序: 数组中元素个数n

  • 检索: 被检索数组的元素个数n

  • 整数乘法: 两个整数的位数m, n

  • 矩阵相乘: 矩阵的行列数 i, j, k

  • 图的遍历: 图的顶点数n, 边数m

  • ……

算法的两种时间复杂度

对于相同输入规模的不同实例, 算法的基本运算次数也不一样, 可定义两种时间复杂度

  • 最坏情况下的时间复杂度W(n)

    算法求解输入规模为n的实例所需要的最长时间

  • 平均情况下的时间复杂度A(n)

    在给定同样规模为n的输入实例的概率分布下, 算法求解这些实例所需要的平均时间

A(n)计算公式

设S是规模为n的实例集, 实例 i 属于S的概率是Pi, 算法对实例 i 执行的基本运算次数是Ti

A(n)=iSPiTi A(n)=\sum_{i \in S} P_{i} T_{i}

在某些情况下可以假定每个输入实例概率相等

二分检索算法平均时间复杂度分析

算法BinarySearch(T, l, r, x)

输入: 数组T, 下标从l到r; 数x

输出: x出现的位置下标 j
算法分析基础(一)

二分检索算法运行实例

算法分析基础(一)
假设n = 2^k - 1, 输入有2n+1种
算法分析基础(一)
比较t次的输入个数
算法分析基础(一)
对t=1, 2, ……k-1 比较t次: 2^(t-1)个
比较k次的输入有2^(k-1) + n + 1个
总次数: 对每个输入乘以次数并求和

二分检索算法平均时间复杂度

假设n=2^k - 1 , 各种输入概率相等

A(n)=12n+1[t=1k1t2t1+k(2k1+n+1)]=12n+1[t=1kt2t1+k(n+1)]=12n+1[(k1)2k+1+k(n+1)]=k2k2k+1+k2k2k+11k12=logn+12 \begin{aligned} &A(n)=\frac{1}{2 n+1}\left[\sum_{t=1}^{k-1} t 2^{t-1}+k\left(2^{k-1}+n+1\right)\right]\\ &=\frac{1}{2 n+1}\left[\sum_{t=1}^{k} t 2^{t-1}+k(n+1)\right]\\ &=\frac{1}{2 n+1}\left[(k-1) 2^{k}+1+k(n+1)\right]\\ &=\frac{k 2^{k}-2^{k}+1+k 2^{k}}{2^{k+1}-1} \approx k-\frac{1}{2}=\lfloor\log n\rfloor+\frac{1}{2} \end{aligned}

相关文章: