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

时间复杂度与空间复杂度

目录

    • 算法性能分析
      • 时间复杂度度量
      • 空间复杂度度量
    • 时间复杂度渐进分析
    • 空间复杂度渐进分析

算法性能分析

数据结构的优劣与算法直接有关,针对一个具体的问题可能提出若干种不同的算法实现。如何从这些算法种找出性能最优的那个?一个算法与运行环境有关,但是运行环境大有不同,所以算法效率最好通过比较算法的复杂性的度量来评价算法的优劣。

时间复杂度度量

算法的运行时间涉及多种运算,度量算法的运行时间,主要是统计算法的程序步数,各种语句都有相应的程序步数。

空间复杂度度量

程序的存储空间包括两部分:

  1. 固定部分 固定部分的空间大小与输入输出的个数多少、数值的大小均无关。其主要包括存放程序指令代码的空间,常数、简单变量、定长成分(如数组元素、结构成分、对象的数据成员等)变量所占的空间等。该部分为静态空间,只需要简单的进行统计就可以估算其空间复杂度。
  2. 可变部分 该部分的空间主要包括其与问题规模有关的变量所占空间、递归工作栈所用空间,以及在算法运行过程中通过new和delete命令动态使用的空间。

时间复杂度渐进分析

确定一个程序的准确步数非常困难,也不必要,多数情况只要得到估计值就够了。设程序步数为n,时间复杂度为T(n),n增大T(n)也增大。

定义:若存在函数 f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称 f(n)是T(n)的同数量级函数。记作 T(n)= O(n),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。可以理解为O就是一个估算值。

保留对函数影响最高的项,n非常大时候,后面比较小的项可以忽略,如:
T(n)=n+1 忽略常数项约等于n
T(n)=n+n^2 忽略低阶项 约等于n^2
T(n)=3n 忽略最高阶的系数约等于n
程序有几种时间复杂度(依次增大):
1.O(1) 常数阶

int n;
n=10;
cout<<n;

T(n)=3,常数1取代3,时间复杂度为O(1)
2.O(logn) 对数阶

int sum=1;
while(sum<n){
    sum=sum*2;
}

T(n)怎么算呢?利用数学,sum算多少步到n,2^步数=n,所以步数=logn,时间复杂度为O(n)
3.O(n) 线性阶

for(int i=0;i<n;i++){
    cout<<i;
    cout<<i+1;
}

T(n)=2n,n取代2n,时间复杂度为O(n)
4.O(n^2) 平方阶

for(int i=0;i<n;i++){
    cout<<i;
    for(int j=0;j<n;j++){
        cout<<j;
    }
}

T(n)=n+n2,去掉低阶n简化为n2,时间复杂度为O(n^2)
5.O(nlogn) 线性对数阶 常用,如归并排序、插入排序

for(int m=1; m<n; m++){
    i=1;
    while(i<n){
        i=i*2;
    }
}

logn对数阶我们知道了,那么其实n倍的logn就是线性对数阶

空间复杂度渐进分析

时间复杂度不是计算程序具体步数耗时,那么空间复杂度也不是用来计算程序实际占用的空间的。问题规模趋于无穷大时,用O表示法表示。

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的一个量度,同样反映的是一个趋势,我们用 S(n) 来定义。记为:S(n)=O(f(n))

1.O(1) 常数阶
算法执行所需要的临时空间不随着某个变量n的大小而变化,即此算法空间复杂度为一个常量,可表示为 O(1)

int i=1;
int j=1;
j++;

S(n)=3,常数1取代3,空间复杂度为O(1)
2.O(n) 线性阶

int[]m= new int[n];
for(i=1;i<=n;i++) {
   j++;
}

第一行动态创建数组,数据占用的大小为n,下面虽然有循环,但没有再分配新的空间,因此,这段代码的空间复杂度主要看第一行即可,即 S(n) = O(n),空间复杂度为O(n)。

相关文章:

  • 【Leetcode】背包问题-416. 分割等和子集
  • 【算法作业】实验五-2:一元三次方程的根-连续区间的二分搜索求近似解
  • 京东面试——算法工程师
  • 【C#】【平时作业】习题-12-事件
  • 文件IO(刷BMP格式图片、JPG格式图片)
  • 矩阵顺时针反转
  • arm-2d移植到OneOS上的使用
  • 文章说明86145B安捷伦光学分析仪86145B
  • 网课答案查题功能调用接口
  • 『Halcon与C#混合编程』012_迈德威视工业相机SDK入门
  • 以太坊合并可能会引发的雪崩
  • 记一次Prometheus监控下的“内存飙升”事件
  • Linux——进程操作之创建
  • 葡聚糖-聚乙烯亚胺Dextran-PEI,聚乙烯亚胺修饰纤维二糖/香菇多糖/辣根过氧化氢酶/溶菌酶
  • 浙大MBA网上报名关键信息点提醒,选错一个,回头重来
  • (三)从jvm层面了解线程的启动和停止
  • 【刷算法】求1+2+3+...+n
  • angular2开源库收集
  • CAP 一致性协议及应用解析
  • CSS实用技巧干货
  • k8s 面向应用开发者的基础命令
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 前端存储 - localStorage
  • 使用权重正则化较少模型过拟合
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 项目实战-Api的解决方案
  •  一套莫尔斯电报听写、翻译系统
  • 【云吞铺子】性能抖动剖析(二)
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​业务双活的数据切换思路设计(下)
  • $NOIp2018$劝退记
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (ZT)一个美国文科博士的YardLife
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (八十八)VFL语言初步 - 实现布局
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (学习日记)2024.02.29:UCOSIII第二节
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • ******之网络***——物理***
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • /bin/bash^M: bad interpreter: No such file or directory
  • [ C++ ] STL_list 使用及其模拟实现
  • [1159]adb判断手机屏幕状态并点亮屏幕
  • [Angular] 笔记 7:模块
  • [ASP]青辰网络考试管理系统NES X3.5
  • [codeforces] 25E Test || hash
  • [codevs 1515]跳 【解题报告】
  • [CQOI 2010]扑克牌