算法分析基础(一)
算法的时间复杂度
算法的概念想必大家要么不知道, 要么烂熟于心, 感兴趣的百度一下, 其实我觉得不是那么重要(只是我觉得), 只要会计算算法的复杂度就可以了(这部分我认为相当重要)
概念
-
算法的时间复杂度: 针对指定基本运算, 计数算法所做运算次数
-
基本运算: 比较, 加法, 乘法, 交换, 置指针……
-
输入规模: 输入串编码长度通常用下述参数度量: 数组元素个数, 调度问题的任务个数, 图的顶点数与边数等.
-
算法基本运算次数可以表示为输入规模的函数
-
给定问题和基本运算就决定了一个算法类
输入规模
-
排序: 数组中元素个数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 ) = ∑ i ∈ S P i T i A(n)=\sum_{i \in S} P_{i} T_{i} A(n)=i∈S∑PiTi
在某些情况下可以假定每个输入实例概率相等
二分检索算法平均时间复杂度分析
算法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 ) = 1 2 n + 1 [ ∑ t = 1 k − 1 t