当前位置: 首页 > news >正文

计算时间复杂度

1.引言

我们之前学过许多算法,例如:二分查找、归并排序(博客链接,若没学过,慢走不送)。

我们在学习二分查找的时候就抛出过一个问题:如何计算时间复杂度。我们当时只是粗略的讲了一下什么是时间复杂度,今天我们来学习计算一下。

2.计算时间复杂度

2.1 认识不同种类时间复杂度

2.1.1 常数阶

即时间复杂度为 O(1) 的算法。例如:

#include <bits/stdc++.h>
using namespace std;
int main() {cout << "Hello World" << endl; // 运行第一步return 0;
}

但不一定只执行一次,又例如:

#include <bits/stdc++.h>
using namespace std;
int main() {int n; // 运行第一步cin >> n; // 运行第二步cout << n << endl; // 运行第三步return 0;
}

这段代码的时间复杂度也是 O(1),只要没有循环(重复写一段代码也算循环)时间复杂度就是 O(1)

2.1.2 对数阶

即时间复杂度为  O(LogN)  的算法,例如:

#include <bits/stdc++.h>
using namespace std;
int main() {int n; // 执行1次cin >> n; // 执行1次int sum = 1; // 执行1次while(sum < n) // 执行 LogN 次sum *= 2; // 每次执行1次cout << sum << endl; // 执行1次return 0;
}

这里默认是  O(Log_2N)  ,如果是以2为底,那么在 编程 中可以省略,数学中不可以。如果是以别的数字为底,那么需要特殊标注,例如  O(Log_3N)  。

2.1.3 线性阶

即时间复杂度为  O(n)  的算法,例如:

#include <bits/stdc++.h>
using namespace std;
int main() {int n; // 执行1次cin >> n; // 执行1次for(int i = 1; i <= 10; i++) // 执行 n 次cout << i << " "; // 每次执行1次cout << endl; // 执行1次return 0;
}

我们可以看到,就是一个单纯的循环。

2.1.4 nlogn阶

即时间复杂度为  O(NLogN)  的算法。例如:

#include <bits/stdc++.h>
using namespace std;
int main() {int n; // 执行1次cin >> n; // 执行1次for(int i = 1; i <= n; i++) // 执行 n 次{int sum = 1; // 每次执行1次while(sum < n) // 每次执行 LogN 次sum *= 2; // 每次执行1次cout << sum << endl; // 每次执行1次}return 0;
}

就是  O(n) * O(LogN)  特别简单。

2.1.5 平方阶

即时间复杂度为  O(n^2)  的算法。例如:

#include <bits/stdc++.h>
using namespace std;
int main() {int n; // 执行1次cin >> n; // 执行1次for(int i = 1; i <= n; i++) // 执行 n 次{for(int j = 1; j <= n; j++) // 每次执行 n 次cout << '(' << i << ', ' << j << ')' << ' '; // 每次执行1次cout << endl; // 每次执行1次}return 0;
}

就是  O(n) * O(n)  特别简单。

2.1.6 立方阶

即时间复杂度为  O(n^3)  的算法。例如:

#include <bits/stdc++.h>
using namespace std;
int main() {int n; // 执行1次cin >> n; // 执行1次for(int i = 1; i <= n; i++) // 执行 n 次{for(int j = 1; j <= n; j++) // 每次执行 n 次{for(int k = 1; k <= n; k++) // 每次执行 n 次cout << '(' << i << ', ' << j << ', ' << ')' << ' '; // 每次执行1次cout << endl; // 每次执行1次}cout << endl; // 每次执行1次}return 0;
}

就是  O(n^2) * O(n)  特别简单。

2.1.7 指数阶

即时间复杂度为  O(2^n)  的算法。例如:

#include <bits/stdc++.h>
using namespace std;
int fib(int n) {if(n == 0 || n == 1)return 1; // 执行1次elsereturn fib(n - 1) + fib(n - 2); // 执行 2^n 次
}
int main() {int n; // 执行1次cin >> n; // 执行1次cout << fib(n) << endl;return 0;
}

我们可以看到,斐波那契数列的递归求解时间复杂度就是 O(2^n)

2.1.8 阶乘阶

即时间复杂度为  O(n!)  的算法。本时间复杂度太大太罕见,暂无代码示例(若实在想看,慢走不送

2.2 计算时间复杂度

要计算的代码:

#include <bits/stdc++.h>
using namespace std;
int arr[105];
int search(int target) {int left = 1, right = n;while(left <= right){int mid = left + (right - left) / 2;if(arr[mid] == target)return mid;else if(arr[mid] > target)right = mid - 1;elseleft = mid + 1;}return -1;
}
int main() {int n, target;cin >> n >> target;for(int i = 1; i <= n; i++)cin >> arr[i];sort(arr + 1, arr + n + 1);cout << search(target) << endl;return 0;
}

首先把算法的执行次数写成一个多项式,就是把代码每一个部分写成一个单项式,然后相加得到多项式。

例如上面的代码就是 T(n) = 3 + n + LogN。

然后只保留最高阶项,若没有,就找出带有未知量的,就是LogN。

然后在去掉前面的系数,若没有,就不变。

然后把剩下的部分放到大O表示法的括号里面,完成!时间复杂度为:

O(LogN)

3.总结

这就是我们今天学习的内容,内容比较多,希望大家好好消化。

再见!

http://www.dtcms.com/a/477512.html

相关文章:

  • 【ComfyUI】视频替换背景
  • 天形、地气、人神:一种基于阴阳三元论的统一智能理论框架研究
  • 南通市经济开发区建设局网站网站建设企业网银e路通
  • Spring Boot 集成 WebSocket 的实战案例
  • 1-Ubuntu上创建脚本一键更换软件源
  • 【第2篇】nl2sql2025开发环境配置
  • 用 PyTorch 实现 MNIST 手写数字分类与训练损失曲线绘制
  • 获取 OpenAI API Key 全攻略:从入门配置Key到 GPT-5 Pro 集成与安全实战
  • 使用 Actix Web 构建 Web 应用
  • Rust开发环境搭建
  • MFC中一个类的成员变量值自动被篡改:多重继承带来的问题
  • 潘家园网站建设wordpress 虚拟主
  • 【第五章:计算机视觉-计算机视觉在工业制造领域中的应用】1.工业缺陷分割-(1)工业品缺陷风格基础知识:割任务定义、数据集介绍
  • Redis除了做缓存还能用来干什么
  • 【Frida Android】基础篇4:Java层Hook基础——调用静态方法
  • 中国建筑网官网图片深圳网站排名优化团队
  • Vue3+Three.js实现3D模型加载与动画(实践:官方的一个样例)
  • mac maven 安装
  • 体验GPT-OSS-120B:在PH8平台上探索超大规模语言模型的强大能力
  • Spark和Flink差异
  • 怎么做网站广告赚钱专业网站设计团队
  • 网站建设这块是怎么挣钱的网站服务器买了后怎么做
  • 从注册到养号,Walmart鲲鹏系统打造完整运营链路
  • 云服务器安装JDK、Tomcat、MySQL
  • 科创企业品牌营销顾问:助力企业腾飞的关键角色
  • 怎样解读黑格尔的客观唯心主义
  • 5-2〔OSCP ◈ 研记〕❘ SQL注入攻击▸MySQL MSSQL基础
  • 电话交换机IPPBX的数据存储在AWS亚马逊云
  • 公共数据开放网站建设怎样做app
  • 嵌入式学习linux内核驱动8——IIC设备驱动和lm75-dht11