算法分析基础
数学基础
定义
如果存在正常数c与n0,使得当N >= n0时T(N) <= cf(N),则记为。
如果存在正常数c与n0, 使得当N >= n0时T(N) >= cg(N),则记为。
当且仅当T(N) = O(h(N))且T(N) = Ω(h(N))时,则。
如果T(N) = O(p(N))且T(N) != Θ(p(N)),则。
法则
如果T1(N) = 且T2(N) = ,那么:
(a)T1(N) + T2(N) =
(b)T1(N) * T2(N) =
如果T(N)是一个k次多项式,则
对于任意常数k,
函数增长率
典型增长率
函数 | 名称 |
c | 常数 |
对数级 | |
对数平方根 | |
N | 线性级 |
平方级 | |
立方级 | |
指数级 |
判断两个函数的增长率
可以通过比较两个函数的极限:,来确定两个函数的增长率。必要的时候,还可以使用洛必达法则。
该极限有4种可能:
1 极限是0,这意味着;
2 极限是常数c != 0,这意味着;
3 极限是,这意味着;
4 极限摆动,二者无关
运行时间计算的一般法则
for循环
一次for循环的运行时间至多是for循环内语句(包括测试)的运行时间乘以迭代得次数
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
k++;
}
}
上面的例子当中,时间复杂度是。
顺序语句
将各个语句的运行时间求和即可(这意味着,其中的最大值就是所得得运行时间)
1 2 3 4 5 6 7 8 9 | for (i = 0; i < N; i++) { A[i] = 0; } for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { A[i] += A[j] + i + j; } } |
上面例子当中,第一个循环时间复杂度是,第二个循环时间复杂度是,两个循环的总体时间复杂度为,也就是还是。
if/else语句
对于程序片段:
if (condition) {
S1;
} else {
S2;
}
一个if/else语句得运行时间从不超过判断再加上S1和S2中运行时间长的运行时间。
运行时间中的对数
如果一个算法用常数时间O(1)将问题的大小削减为其一部分(通常是1/2),那么该算法得时间复杂度就是。举个例子,下面是用迭代的方法写的二分查找:
int BinarySearch(const ElementType A[], ElementType X, int N) {
int Low, Mid, High;
Low = 0;
High = N - 1;
while (Low <= High) {
Mid = (Low + High) / 2;
if (A[Mid] < X) {
Low = Mid + 1;
} else {
if (A[Mid] > X) {
High = Mid - 1;
} else {
return Mid;
}
}
}
return NotFound;
}
在上面的二分法中,每次迭代的时间复杂度是,并且每次迭代之后,问题复杂度就减为原来的一半,因此,这个程序的时间复杂度为。
另一方面,如果使用常数时间只是把问题减少一个常数(如将问题减少1),那么这种算法就是。举个例子,下面使用递归的方式求解N!:
long int Factorial(int N) {
if (N <= 1) {
return 1;
} else {
return N * Factorial(N - 1);
}
}
在上面的递归中,每次递归的时间复杂度是,并且递归之后,问题复杂度只比原来少1,因此,这个程序的时间复杂度就是。
递归时间复杂度总结
对于一个问题复杂度为T(N)的问题,可以分解为如下的表达式:
,其中a是常数,且a >= 1, b也是常数,b > 1。
1 如果存在正常数令,那么;
2 如果,那么;
3 如果存在正常数使得且存在常数c < 1使得对于足够大的N满足,那么.
这三种情形如何记忆呢?我们可以这样记忆,三种情况的结果取决于函数f(N)与的大小。如果大,那么结果就是情形1;如果是f(N)大,那么结果就是情形3;如果两个同级别,那么就是情形2。
还需要注意的事情是,这三种情形没有覆盖所有的情形。情形1与情形2之间有Gap,如果f(N)比小,但是如果不是同时小一个因子,就落到情形1与情形2之间;同时,情形2与情形3之间也有Gap,如果f(N)比大,但是如果不同时大一个因子,就落到情形2与情形3之间。如果发生这两种情形,就无法应用上面的三个公式。
下面我们看一下实际的例子。
1
其中a = 9, b = 3, f(N) = N,,并且,其中,那么这个满足情形1,即。
2
其中a = 1,b = ,f(N) = 1,同时,那么这就满足情形2,即。这其实就是上面运行时间中的对数当中得情形1。
3
其中a = 3,b = 4,f(N) = ,。因为 ,同时对于足够大的N,满足,其中。这就满足了情形3,即。
4
其中a = 2,b = 2,, ,表面上看,这属于情形3,但是,却不存在一个正常数,使得。所以无法运用上面3中情形的公式。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了