数据结构与算法(一)| 时间复杂度与空间复杂度
时间:2022-07-22
本文章向大家介绍数据结构与算法(一)| 时间复杂度与空间复杂度,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
算法时间复杂度
算法的时间复杂度,也就是算法的时间量度,记做: T(n) = O(f(n)) . 它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称为时间复杂度。其中f(n) 是问题规模n的某个函数。
大O阶推导
推导大O阶的方法如下:
- 用常数1取代运行时间中的所有加法常数
- 修改后的运行次数函数中,只保留最高项
- 如果最高阶存在且不是1,则去除与这个项相乘的常数
- 得到的最后结果就是大O阶。
常数阶
例:
int sum = 0, n = 100;
printf("hello worldn");
printf("hello worldn");
printf("hello worldn");
printf("hello worldn");
printf("hello worldn");
sum = (1+n)*n /2;
参考上述推导方法一可以知道,上述代码的大O 是 O(1)
线性阶
例:
int i, n = 100; sum = 0;
for (i = 0; i < n; i++) {
sum = sum + i;
}
上述代码大O为 O(n)
。
平方阶
例1:
int i, j, n = 100;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
printf("Hellon");
}
}
外层每执行一次,内层执行100次。总的执行次数为 100 * 100。即 n 的平方。此时 大O 为 O(n^2)
PS:如果是三层嵌套则为 O(n^3)
例2:
int i, j, n = 100;
for (i = 0; i < n; i++) {
for (j = i; j < n; j++) {
printf("Hellon");
}
}
根据上述代码可知,总的执行次数为
n + (n-1) + (n-2) + ... + 1 = n(n+1)/2
n(n+1)/2 = n^2/2 + n/2
根据上述推导方法,没有常数第一条忽略,第二条只保留最高项,所以可以去掉 n/2 , 第三条去掉与最高项相乘的常数,最终得到结果为 O(n^2)
对数阶
int i = 1, n = 100;
while( i < n) {
i = i * 2;
}
假设有x个2相乘大于等于n,则退出循环。
2^x = n
x = log(2)n
所以大O 为 O(logn)
常见的时间复杂度
例子 |
时间复杂度 |
术语 |
---|---|---|
242342 |
O(1) |
常数阶 |
3n+4 |
O(n) |
线性阶 |
3n^2+4n+5 |
O(n^2) |
平方阶 |
n3+2n2+3n+1 |
O(n^3) |
立方阶 |
3log(2)n + 4 |
O(logn) |
对数阶 |
2n+3nlog(2)n+14 |
O(nlogn) |
nlogn阶 |
2^n |
O(2^n) |
指数阶 |
时间从小到大依次是:
O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)
算法空间复杂度
算法的空间复杂度通过计算算法所需的存储空间实现,记做:S(n) = O(f(n)) . 其中n为问题规模,f(n) 为语句关于n所占存储空间的函数
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Git 删除已提交的文件
- Sublime 怎么装SQL语法检测器
- Vue 设置环境变量和模式
- 你真的掌握了Python基本语法了吗?
- Mybatis-Generator 代码生成器的使用
- 提高数据分析工作效率-Sublime如何设置默认打开文件格式
- 使用 freemarker 制作代码生成器
- 假期闲的慌,不如做一点SQL基础练习吧
- Vue 中全局过滤器的使用
- 游戏-CSP201712-2-Java
- Mybatis generator 生成 Mapper 方法不全
- Vue 中使用 JQuery 插件不起作用
- 公共钥匙盒-CSP数组排序练习
- 疫情这么严重,还不待家里学Numpy和Pandas?
- CSP-201812-2-小明放学-Java