时间复杂度判断

时间复杂度基础

首先,看看下面的程序。

cpp 复制代码
int x; // init

x ++; // first add

x ++; // second add

// 2 add
cpp 复制代码
int x; // init

int n;
cin >> n;

for (int i = 1; i <= n; i ++)
    x ++;
cpp 复制代码
int x; // init

int n;
cin >> n;

for (int i = 1; i <= n; i ++)
    for (int i = 1; i <= n; i ++)
        x ++;

很明显,这些程序的运行效率都不一样。

那么,怎么比较这些程序的效率呢?或者说 `时间复杂度`?

一步表示什么

首先我们要定义一个代表一次运算的单位,把它算作1。

比如上面的3个程序,加法(x ++)操作就是1。

那么就简单计算一下这三个程序执行了多少个1。

第一个程序:执行了两次 -> 2

第二个程序:循环有n次,循环内部有一次,所以执行了n * 1 = n次 -> n

第三个程序:两个循环分别执行了n次,循环内部有一次,所以执行了n * n * 1 = 次 -> n^2

大O表示法

我执行1次加法操作,和执行10次加法操作有什么区别。

或者说执行一次上面第二个程序的循环,和执行十次有什么区别。

可以说是一个是 1 一个是 10,一个是 n 一个是 10n。

但是无论是n多大,执行一次和执行十次它们差的倍数都一样多,都是10倍。不会n越大,差别越来越大(指倍数)

所以可以使用一个低估的下界(执行次数<1的时候是上界,有点难理解)来表示运行效率。

所以第一个程序效率是 2 -> O(1)

第二个程序是 n -> O(n)

第三个程序是 n^2 -> O(n^2)

考虑有一个嵌套的for+一个单层的for,当n无限大的时候,单层的for带来的效率变化小到可以忽略不计,所以 n^2 + n -> O(n^2)

  1. 常数项可以忽略

  2. 取最高的项数

有什么时间复杂度

有O(1) O(n) O(n^2)等,还有一些O(2^n)之类的。这里了解一下最常用的。

O(1)

O(log n) // 表示n为2时,执行1次左右 n为4时,执行2次左右 n为8时,执行3次左右 ...

O(n)

O(n^2)

O(n^3) // 三层for循环

递归时间复杂度

考虑一个fibo函数

cpp 复制代码
void fibo(int n) {
    if (n <= 1)
        return n;
    return fibo(n - 1) + fibo(n - 2)
}

一次计算当然是执行一次函数(不包含递归),但是里面还有一个函数怎么办?

我们知道这个函数一次性会分支成两个函数,然后是四个,难道时间复杂度就是O(2^n)?

我们可以确定,时间复杂度一定是O(k^n),但是k是什么?

我们写出递归的方程

其中t^n表示我们的时间复杂度,t^(n - 1)表示fibo(n - 1)的时间复杂度。

两边除以t^(n - 2)

解出这个方程,就可以得到t,那么时间复杂度的O(t^n)不就算出来了吗?

相关推荐
Lionel6893 小时前
分步实现 Flutter 鸿蒙轮播图核心功能(搜索框 + 指示灯)
算法·图搜索算法
小妖6663 小时前
js 实现快速排序算法
数据结构·算法·排序算法
xsyaaaan3 小时前
代码随想录Day30动态规划:背包问题二维_背包问题一维_416分割等和子集
算法·动态规划
王老师青少年编程4 小时前
2024年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第3题)
c++·题解·真题·csp·信奥赛·csp-s·提高组
凡人叶枫4 小时前
C++中输入、输出和文件操作详解(Linux实战版)| 从基础到项目落地,避坑指南
linux·服务器·c语言·开发语言·c++
CSDN_RTKLIB4 小时前
使用三方库头文件未使用导出符号情景
c++
zheyutao4 小时前
字符串哈希
算法
A尘埃4 小时前
保险公司车险理赔欺诈检测(随机森林)
算法·随机森林·机器学习
大江东去浪淘尽千古风流人物5 小时前
【VLN】VLN(Vision-and-Language Navigation视觉语言导航)算法本质,范式难点及解决方向(1)
人工智能·python·算法
rainbow68895 小时前
Linux文件描述符与重定向原理
c++