数据结构与算法(一)| 时间复杂度与空间复杂度
时间: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所占存储空间的函数
- ifconfig: command not found CentOS专版,其他的可以参考
- Codeforces 833E Caramel Clouds
- Codeforces 833D Red-black Cobweb【树分治】
- Codeforces 834E The Bakery【枚举+数位dp】
- 【Java学习笔记之一】java关键字及作用
- 如何让所有实体类用相同名称的主键(很有力的问题,比如所有表实体主键都用ID)
- Codeforces 834D The Bakery【dp+线段树维护+lazy】
- memcached安装及.NET中的Memcached.ClientLibrary使用详解
- AtCoder Beginner Contest 069【A,水,B,水,C,数学,D,暴力】
- 2017"百度之星"程序设计大赛 - 资格赛【1001 Floyd求最小环 1002 歪解(并查集),1003 完全背包 1004 01背包 1005 打表找规律+卡特兰数】
- 洛谷 2634&&BZOJ 2152: 聪聪可可【点分治学习+超详细注释】
- 【经验总结】Java在ACM算法竞赛编程中易错点
- 【Java学习笔记之六】java三种循环(for,while,do......while)的使用方法及区别
- 类A是公共的,应在名为A.java的文件中声明错误
- 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 数组属性和方法
- 微信小程序怎么做链接可以链到小程序的其它页面。
- 如何实现一个 3D 效果的魔方
- FlutterDojo设计之道—状态管理之路(三)
- 微信头像加国旗
- FlutterDojo设计之道—状态管理之路(四)
- FlutterDojo设计之道—状态管理之路(五)
- Python高级进阶(一)Python框架之Django入门
- python 自动化测试(2):针对密码输入框为密码控件时的解决方案
- 微信小程序开发之视图容器swiper
- WINDOWS服务器同时安装多个版本的MYSQL的方法,MQYSQL5和MQYSQL8的共存。
- 使用PHP对接国外的PAYPAL支付最新REST API接口。
- golang 学习(10): 使用go语言调用c语言的so动态库
- Django的form,model自定制
- 排序算法与查找算法
- nginx学习(1): openresty安装