设计算法,必须了解如何计算算法的时间复杂度和空间复杂度。在实际问题中你才能估计当前算法还有多少可以优化的空间。

1、了解时间复杂度和空间复杂度。

  • 时间复杂度:是指执行当前算法所消耗的时间。
  • 空间复杂度:是指执行当前算法需要占用多少内存空间。

时间复杂度:

常用的几个时间复杂度:

O(1)< O(log(n)) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)

一台计算机上运行所需要的时间。

不可能精确表示算法的时间复杂度——分为最坏情况、最好情况和平均情况。

算法效率的主要指标是基本操作次数的增长次数。为了将算法效率比较和归类,确定了3种符号:

上界:

p对于足够大的nt(n)的上界由g(n)的常数倍来确定,即:t(n)<=Cg(n),记作t(n)=O(g(n))。

下界:

f(n)是某一算法的时间复杂性函数,g(n)是某一函数,当且仅当存在正的常数C和n0,使得对于所有的n>=n0,有f(n)≥Cg(n),记作f(n)= Ω(g(n))。

近似:

当且仅当存在正的常数C1和C2,使得对于所有的n>=n0,有 C1g(n)≤ f(n) ≤ C2g(n ),

记作: f(n)= Ө(g(n)) 。

例子:

解决时间复杂度的数学分析方法

基本操作通常是算法最内层循环中最费时的操作。

实际计算时间复杂度,我们会假设问题的规模充分大时(n趋近于无穷),算法在渐近意义上的阶。

算法时间效率分析方法主要由非递归分析法和递归式分析法两种。

1)分析非递归算法时间效率的通用方案

1、确定算法中作为输入规模的参数;
2、找出算法的基本操作(通常位于算法的最内层循环中的操作);
3、检查对于相同规模的不同输入实例,基本操作的执行次数是否可能不同,如果有,则需对最差效率、平均效率以及最优效率分别进行讨论;
4、建立算法基本操作的执行频度的计算表达式;
5、利用计算表达式的计算法则确定问题求解时间与问题规模的增长关系。

非递归算法的分析比较简单,一般基本操作的执行次数很明显,可以直接写出其时间复杂度。

2)分析递归算法时间效率的通用方案

1、确定算法中作为输入规模的参数;
2、找出算法的基本操作;
3、检查对于相同规模的不同输入实例,基本操作的执行次数是否可能不同,如果有,则需对最差效率、平均效率以及最优效率分别进行讨论;
4、针对算法基本操作的执行次数,建立与输入规模有关的递推关系式及其初始条件;
5、求解递推式以确定问题求解时间与问题规模的增长关系。

递归时间复杂度常用的解法:

分治法所满足的递归方程

问题规模为n的问题被分解成a个(n/b)个规模的子问题。f(n)是不参与递归部分的时间复杂度。

常用解法:(找出近似时间复杂度

1) 代入法

【思路】:首先要对问题的时间复杂度做出预测,然后将预测带入原来的递归方程,如果没有出现矛盾,则是可能的解,最后用数学归纳法证明。

例子1:

有如下的递归问题:

假设预测时间复杂度为

,不妨设
(其中k为常数)。

将该结果带入方程中可得:方程左边

,方程右边

当n区域无穷,由于

的阶高于
的阶,因而左右两边是相等的?

你会发现

是始终成立的。你相当于发现一个下界(而且很可能不是很准确的下界)。

假设

,带入上述方程:

所以又找到了上界O(n^3)。结果还是不准确。

假设

,你会发现又发现一个下界,相对准确一点的下界。

2)迭代法

例子:

递归地展开上述式子,可以得到此图。

得到:

得到趋近O(n^2)。

递归法一般规律总结:

对于

有如下递归:

相当于计算总共又多少结点,这个递归高度h是:logb(n)。宽度假设是a(几个子问题),则结点总共有:

所以,前面的T的时间复杂度计算出来了,需要估计f(n)的时间复杂度。

情况1:

此时如果f(n)的增长速度是多项式倍的慢于T的估计时间,则可得到:

情况2:

可近似等于:

即:

则有:

情况3:

若f(n)增长的比前一项快很多,则有:

其他一般规律:

3、递推式是一个无穷序列幂级数的递归算法时间复杂度分析方法

例如斐波那契数列:

T(n)=T(n-1)+T(n-2)。

母函数法和特征方程法等等,后续更新,需要一些数学基础。

计算较简单的空间复杂度:

一个程序执行时除了需要存储空间和存储本身所使用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的工作单元和存储一些为现实计算所需信息的辅助空间。

1)固定部分:这部分空间的大小与输入/输出的数据的个数多少、数值无关,主要包括指令空间(即代码空间)、数据空间(常量、简单变量)等所占的空间,这部分属于静态空间。

2)可变空间:这部分空间的主要包括动态分配的空间,以及递归栈所需的空间等,这部分的空间大小与算法有关。

算法的空间复杂度并不是计算实际占用的空间,而是计算整个算法的辅助空间单元的个数。(相当于衡量动态分配的空间)。

辅助变量是算法运行过程中临时占用的存储空间,与空间复杂度相关。

栗子:

1)斐波那契数列:

public static int f1(int n) {if(n < 1) {return 0;}else if(n == 1 || n == 2) {return 1;}return f1(n-1) + f1(n-2);

斐波那契数列是由当前数的前两个数相加得到当前数。

你会发现随着你要求的数n的增大,计算机需要动态存储的前面的数也要增大,我要求5,那么需要求出前4个数占用了内存空间。以此递增,所以空间复杂度为O(n)。

2)二分查找法

要求数据必须的排好序的,每次以中间的值进行比较,根据比较的结果可以直接舍去一半的值,直至全部找完(可能会找不到)或者找到数据为止。

while(top <= end){mid = (top + end) / 2;if(number[mid] == key){//如果找到,直接跳出循环find = mid;break;}else if(number[mid] > key){//如果当前值比需要找的值大,就将尾部的下标移至mid的前一处end = mid - 1;}else{//如果当前值比需要找的值小,就将头部的下标移至mid的后一处top = mid + 1;}}

你会发现二分查找一直是在一个数组。因为整个运算过程没有空间的改变,所以空间复杂度为O(1)。

正圆锥体空间方程_计算机基础算法(一)——时间与空间复杂度相关推荐

  1. 正圆锥体空间方程_科学解读:什么是时间?什么是空间?理论上时空是什么?...

    时间与空间是无处不在的,但时间与空间到底是什么呢? 对于如此底层的事物,我们很难用生活中的具体概念或直观感受,去理解和描述.因为认知一个事物,往往是从底层了解其组成部分,而时间与空间显然在底层,我们的 ...

  2. 正圆锥体空间方程_数值模拟偏微分方程的三种方法:FDM、FEM及FVM

    偏微分方程数值模拟常用的方法主要有三种:有限差分方法(FDM).有限元方法(FEM).有限体积方法(FVM),本文将对这三种方法进行简单的介绍和比较. 一.有限差分方法 有限差分方法(Finite D ...

  3. 正圆锥体空间方程_电路原理中三相缺相保护器是如何工作的,正负序与它有什么关系...

    三相缺相保护原理 概述: 三相缺相.相序错误保护器是为三相电源缺相或错相引起三相系统故障而设计的保护器,主要应用在三相系统异常可能引起工业生产发生严重事故的场所,比如相序错误影响并网逆变器设备正常工作 ...

  4. 正圆锥体空间方程_你也可以理解“麦克斯韦方程组”

    自然和自然的规律隐藏在茫茫黑夜之中.上帝说:让牛顿降生吧.于是一片光明.--亚历山大·蒲柏 上帝又说:还要有光,于是便有了麦克斯韦方程组.

  5. 计算机及网络应用基础思维导图_计算机基础/算法/面试题 PDF+思维导图下载

    之前为了面试,整理了九大应付面试的思维导图 + 一份 630 页的程序员内功修炼手册 + 一份计算机基础/算法/Java技术栈/Linux C++技术栈的资料.当时我就是靠着这份思维导图以及整理的 P ...

  6. a*算法的时间复杂度_数据结构与算法系列——时间、空间复杂度

    数据结构和算法本质就是帮我们用最快的时间和最少的空间来执行我们的代码.所以,执行效率是衡量一个算法的非常重要的指标.那如何来计算你的算法代码的执行效率呢?这就需要时间.空间复杂度来分析了. 有人可能会 ...

  7. 一层循环时间复杂度_数据结构与算法系列——时间、空间复杂度

    数据结构和算法本质就是帮我们用最快的时间和最少的空间来执行我们的代码.所以,执行效率是衡量一个算法的非常重要的指标.那如何来计算你的算法代码的执行效率呢?这就需要时间.空间复杂度来分析了. 有人可能会 ...

  8. 计算机术语中CPU是指______,试题题库_计算机基础知识考试试卷全套.doc

    试题题库_计算机基础知识考试试卷全套.doc 第一部分 计算机基础知识 (一)单项选择题 1. 世界上第一台计算机使用的物理器件是( ). A)电子管 B)继电器 C)晶体管 D)集成电路 2. 第四 ...

  9. 【算法】时间和空间复杂度

    文章目录 前言 一.时间复杂度 二.空间复杂度 三.常见的案例和示例 1. 线性查找(Linear Search) 2. 快速排序(Quick Sort) 3.动态规划(Dynamic Program ...

  10. sklearn tfidf求余弦相似度_【基础算法 】文本相似度计算

    在自然语言处理中,文本相似度是一种老生常谈而又应用广泛的基础算法模块,可用于地址标准化中计算与标准地址库中最相似的地址,也可用于问答系统中计算与用户输入问题最相近的问题及其答案,还可用于搜索中计算与输 ...

最新文章

  1. flask_模拟请求post,get
  2. mysql sqlserver 函数_等价于MySQL中的SQLServer函数SCOPE_IDENTITY()??mysql-问答-阿里云开发者社区-阿里云...
  3. 认识Backbone (四)
  4. python inspect模块
  5. An overview of gradient descent optimization algorithms
  6. unix查找的字符串包含特殊字符_python3从零学习-5.4.7、Unix风格路径名模式扩展glob...
  7. tomcat:sessionId生成机制导致tomcat启动过慢问题
  8. $con=mysql_connect_php连接mysql mysql_connect()与mysqli_connect()的盲点
  9. java 多线程 扫描,多线程扫描文件夹耗时方法分析
  10. 打破网络沉闷---QQ强制聊天工具再度现身!
  11. JAVA常见算法题(二十五)
  12. 新增页和列表页遇到的坑
  13. 基于Mesos和Docker的分布式计算平台
  14. Linux磁盘分区及文件系统格式化和挂载
  15. 浙江省二级java考试_2020年浙江省高校计算机二级Java考试大纲
  16. 前方高能!java并发编程实战百度网盘
  17. android移动应用技术,Android移动开发技术与应用.pdf
  18. C++ 平方、开方、取整运算
  19. python脚本 游戏赚金币_Python实现王者荣耀刷金币脚本功能
  20. 明源云客微信抢房技巧_明源演示 - 微信抢房_软件抢房_网上选房_手机抢房_代抢房 - 爱抢房...

热门文章

  1. Spring子项目了解
  2. python3实现bicubic(双三次插值)重建四倍放大图像
  3. DEDECMS验证码不正确及其不显示问题
  4. echop 验证码不正确的解决办法
  5. csp-s2020 T1儒略日
  6. 「沙龙回顾」从技术演进角度看猫眼电影
  7. C语言中的while循环语句的使用
  8. 学员_国培阶段性总结心得体会
  9. 计算几何【套模板,推荐模板】 Separating Pebbles UVALive - 7461
  10. [洛谷] P1097 [NOIP2007 提高组] 统计数字