数据结构与算法(C++)– 算法分析
算法分析包括:时间复杂度和空间复杂度分析。以下主要是时间复杂度的分析。
1、数学定义
- O 表示前面是后面的下界,后面是前面的上界
- Ω 表示前面是后面的上界,后面是前面的下界
2、运算法则
- 计算大O时,忽略低阶项和常数因子。
- T(N) = O(N^2) = O(2N^2) = O(N^2+N)
- 可以用求极限 lim f(N)/g(N) 来确定 f(N) 和 g(N) 的相对增长率,必要时可以使用洛必达法则。
- 极限 = 0: f(N) = o(g(N) )
- 极限是常数但!= 0: f(N) = θ(g(N) )
- 极限 = 正无穷: g(N) = o(f(N) )
- 极限不存在:无关系
3、运行时间的计算
- 分析算法的时间复杂度时,不考虑内存访问时间。
- 若无指定,所求的时间复杂度用最坏的情况表示
- 有时也会用平均时间来衡量,但通常准确计算平均时间比较困难
时间计算的一般法则:
- for 循环:O(N)
- 嵌套 for 循环(n层):O(N^n)
- 顺序语句:各个语句的运行时间求和
- if/else 语句:判断时间 + 两者较长
时间复杂度排序:
4、最大子序列和
求一个序列中,连续元素和最大的子序列
int maxSubSum(const vector<int>& a)
{
int maxSum = 0;
thisSum = 0;
for(int i = 0; j<a.size(); ++j)
{
thisSum += a[j];
if(thisSum > maxSum)
maxSum = thisSum;
else if(thisSum < 0)
thisSum = 0;
}
return maxSum
}
- 时间复杂度为 O(N)
- 如果当前序列和大于当前的最大子序列和,更新最大子序列和
- 如果序列和 < 0 表示这将不会对后面和做出任何贡献,舍弃