时间复杂度

算法的时间复杂度描述了一个程序该算法的运行时间,是一个关于代表算法输入值的字符串的长度的函数,相当于计算一个程序总共执行了多少次,这个计算次数的表达式,就是该程序的时间复杂。用大O符号表示。不包含函数的低阶和首项系数,使用这种方式时,时间复杂度可以被称为是渐进的。

空间复杂度

空间复杂度是指一个算法在运行过程中占用临时存储空间大小的量度。一般是指这个程序运行期间最多能用多少个内存空间(给多少个内存空间能使这个程序正常运行)。比如一般的递归算法就有O(n)的空间复杂度。因为每次递归都要有存储返回信息。
一个算法的优劣主要从算法的运行时间和所需要占用的存储空间两个方面衡量。

  • 计算出程序时间空间复杂表达式后如何转换成对应的时间、空间复杂度:

求斐波那契数列的程序:


#include <stdio.h>
int fib(int i)
{if(i<=2){return 1;}else{return fib(i-1)+fib(i-2);}
}
int main()
{int i = 5;printf("%d",fib(5));return 0;
}
  • 时间复杂度
    求第5个斐波那契数的具体过程数如下:

其中求第5个数就要求第4和第3个,求第4个又要求第3和第2个数,以此类推,总共求了9次值,公式2^(n-2)-1+2,经过复杂度转换之后变为2^n。所以这个程序的时间复杂度为2^n。

优化一:这种递归的时间复杂度特别大。所以应该采用循环结构实现来降低时间复杂度。
优化二:采用尾递归实现,详见篇尾。

  • 空间复杂度
    空间复杂度。程序内存分配图如下:

    以下多次使用斐波那契数,下文以数来代替。
    如上图:
    1、要第5个数,需要求第4个,但是要求出第4个数,又要求第3个,求第3个,又要求第2个数,所以现在内存中开辟出如上内存空间。
    2、求出第2个数后返回到第3个数的求值返回列表,因为要求出第3个值又要求出第1个数,所有又在已经销毁的求第2个数的栈空间又压一个栈用来求第1个数。这时第三个数求值完毕。
    3、求出第4个数,因为第3个已经求出,这时需要求出第2个数,因此又开辟了一块空间求第2个数。这时第4个数求值完毕。
    4、这时求第5个数,需要求第4个和第3个数,因为第4个数已经返回回来了,这时需要再一次求第3个数。这时又压了一个栈求第3个数。
    4.1求第3个又要求第1个和第2个数,因此上面再压一个栈又紧接着销毁求第2个数
    4.2再压一个栈又紧接着销毁求第1个数。
    5、第五个求值完毕,返回到main函数。

在此期间,最多开辟过4份空间用来计算第5个数,公式为,N-1,因此。次求斐波那契数列程序的空间复杂度为O(f(N))。

- 尾递归
尾递归算法使斐波那契数时间复杂度大大降低:

#include <stdio.h>
int fib(int i,int fir,int sed)
{if(i<=2){return sed;}else{fib(i-1, sed, fir+sed);}
}
int main()
{int i = 4;scanf("%d",&i);printf("%d",fib(i,1,1));return 0;
}

上述递归算法,将斐波那契数列解析成一个三个一组的数列,从斐波那契数列的前三个算起,依次算到指定位置为止,每次函数传的都是要求的第i位斐波那契数 和 当前斐波那契数的前两个斐波那契数的值。
本人认为这像是一个简单的循环,如果i是大于2的数,循环次数就是将i减到2的次数,然后求出第i个斐波那契数。

时间复杂度与空间复杂度相关推荐

  1. 数据结构(02)— 时间复杂度与空间复杂度转换

    1. 时间复杂度转化为空间复杂度 常用的降低时间复杂度的方法有递归.二分法.排序算法.动态规划等,降低空间复杂度的核心思路就是,能用低复杂度的数据结构能解决问题,就千万不要用高复杂度的数据结构. ​ ...

  2. a*算法的时间复杂度_算法基础——时间复杂度amp;空间复杂度

    关注.星标公众号,学点计算机知识. 整理:persistenceBin 今天来跟大家继续分享一下数据结构的基础知识--算法效率的度量:时间复杂度和空间复杂度.首先来跟大家分享一下在电影<复仇者联 ...

  3. 时间复杂度与空间复杂度分析

    作为开发人员,我们都希望在完成功能的基础上让代码运行的更快.更省空间,那如何衡量编写的代码是否更有效率,这就需要我们学会如何分析代码时间复杂度和空间复杂度. 什么是复杂度分析 执行时间和占用空间是代码 ...

  4. 时间复杂度和空间复杂度3 - 数据结构和算法05

    时间复杂度和空间复杂度3 让编程改变世界 Change the world by program 函数调用的时间复杂度分析 如果我们把问题再实际化一点,大家是否能自己正确的分析出来呢? 我们来看下边这 ...

  5. python【数据结构与算法】一种时间复杂度和空间复杂度的计算方法

    文章目录 1 算法的时间复杂度定义 2 推导大O阶方法 2.1 常数阶 2.2 线性阶 2.3 对数阶 2.4 平方阶 2.5 立方阶 3 常见的时间复杂度排序 4 算法空间复杂度 5 常用算法的时间 ...

  6. 常用的排序算法的时间复杂度和空间复杂度

    常用的排序算法的时间复杂度和空间复杂度                                           1.时间复杂度 (1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出 ...

  7. 关于算法的时间复杂度和空间复杂度的总结

    一.算法的概念   算法(Algorithm)是将一组输入转化为一组输出的一系列计算步骤,其中每个步骤必须能在有限时间内完成.算法是用来解决一类计算问题的,注意是一类问题,而不是一个特定的问题. 二. ...

  8. 【算法的时间复杂度和空间复杂度】-算法02

    算法的时间复杂度和空间复杂度 一个算法的好坏我们主要从"时间"和"空间" 两个维度来衡量 时间维度:是指执行当前算法所消耗的时间,我们通常用 "时间复 ...

  9. 递归二分查找时间复杂度、空间复杂度和稳定性

    递归 递归条件 自己调用自己 有结束条件 二分查找 二分查找对1~100乱序数字查找 l = list(range(1,101)) def bin_search(data_set,val):low = ...

  10. java 空间复杂度_时间复杂度和空间复杂度

    原文首发于微信公众号:躬行之(jzman-blog) 时间复杂度和空间复杂度可以帮助我们根据具体的平台选择合适的算法,要学会以空间换时间或以时间换空间的设计思想,如在单片机等一般是内存空间比较紧张,在 ...

最新文章

  1. php utf-8读取,PHP读取文件,解决中文乱码UTF-8的方法分析
  2. radioGroup中radiobutton不能互斥问题
  3. java 图片处理 图片缩略图,java怎么生成图片缩略图,缩小图片,高清图片缩小
  4. javascript数据结构-介绍
  5. 同时学cpa和Java_2019年,CPA可以和哪些证书同时备考?
  6. Linux第六周学习总结——进程额管理和进程的创建
  7. boost::hana::index_if用法的测试程序
  8. java media player_MediaPlayerForJava(创建一个视频播放器)
  9. 2019广西对口计算机分数线,2019广西本科第一批投档分数线出炉,网友:我差一点考上清华大学...
  10. Maven项目代码中定位resources文件夹下的文件目录,解决文件不存在的问题
  11. interface接口——公共规范标准
  12. JAVA大数据-Week4-DAY3
  13. mysql解压版超详细安装以及各种避坑指南
  14. 【Assembly】Mixed mode dll unable to load in .net 4.0
  15. 360的编码html怎么写,html5之meta charset网页字符编码简写
  16. 黑莓z10 android,黑莓Z10成功刷机完成_黑莓 Z10_手机其它OS-中关村在线
  17. T83723 数人wjh --题解
  18. 亲自动手写一个深度学习框架
  19. matlab星三角变压器,什么是变压器星三角接法
  20. 听说你还不了解微前端?[收藏=学会]

热门文章

  1. mysql中的去除空格函数
  2. 《老路用得上的商学课》51-55学习笔记
  3. MongoDB Compass简易教程
  4. Hardware ---- 输出阻抗
  5. 【JTT1078视频服务器】之音视频的拆解
  6. python画circos图_CIRCOS圈图绘制 – 最简单绘图和解释
  7. 碰撞检测之OBB-OBB检测
  8. MySQL什么情况会导致索引失效?
  9. DDoS的攻击方式和防御方法
  10. 一、Zstack基础知识(ZCCT云计算认证)