时间&空间复杂度

  时间复杂度:

通俗来说就是随着数据量的增加,程序运行的时间花费量是怎么变化的时间复杂度常用大o表示。举个例子,猜数字,猜10个,100个、1000个,猜数的数据量是在增加的,但是实际运行程序花费的时间是怎么变化的呢,是线性的?常数的?还是指数的,它反映的是一个趋势。简而言之,时间复杂度反映的是程序执行时间随输入规模增长的量级。从某种程度上将可以展示算法的scale ability

  how to analyze?

   e.g1:如下,当我们不断增长i的数值,循环的次数也跟着变化,我们用o(n)进行表示

        int i=10;
for (int j = 0; j <=i ; j++) {
System.out.println("logic...");
}

  e.g2: 对于多个循环我们一般从内向外分析,按照这种方式这个算法的表达方式即为O(n^2)

        int n = 10;
// 循环次数为 n
for (int i = 0; i < n; i++){
// 循环次数为 n
for (int j = 0; j < n; j++) {
System.out.println("logic...");
}
}

  e.g3:对于一个block分析我们一般采用时间复杂度最复杂的块进行表示,即这个代码块中为O(n^2)

        int n=10;
// 第一部分时间复杂度为 O(n^2)
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.println("logic1");
}
}
// 第二部分时间复杂度为 O(n)
for (int j = 0; j < n; j++) {
System.out.println("logic2");
}

time complexity summarize:

我认为时间复杂度是每一个软件工程师发展到高级阶段需要考虑的最重要的东西之一,举个例子,使用高峰之际,数据量陡然增大,我们是否能够有信心让用户的体验度和往常一样流畅,我们是否还能对自己写的逻辑很有信心,是的,当然可以通过计算时间复杂度对我们写的东西进行一个把控,我们不能指望测试伙伴来测试出我的程序的好坏,我们需要对我们写的程序熟知它的性能,那样才能称为一个有责任的开发者。

  空间复杂度  

同理,运行一段逻辑,空间花费的复杂度是怎么变化的?以及变化的趋势是什么样子的,用来表达这个的即为空间复杂度。通俗讲,随着数据的增大,程序运行相对应的额外的空间会不会随着数据的增大而增大,这里的额外的空间指的不是程序运行本身的空间,举个例子,一个算法,本身他的需要空间来运行的,额外空间指的是,在运行的期间他会不会开辟新的空间去处理数据,这便是空间复杂度指的的空间。换句话说,它是对一个算法在运行过程中临时占用存储空间的大小量度,我们常常用S(n)=O(f(n))

  how to analyze?

  e.g1:以下代码可知道,随着n的改变,空间不断在变大我们即可分析为S(n) = O(n)

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

  e.g2: 分析,如果n为10,那开辟的空间即为10*10即为100,可推断出开辟空间为n² ,即表示为S(n) = O(n)²

      int [][] m=new int[n][n];
for (int i = 0; i < =n ; ++i) {
System.out.println("logic...");
}

space complexity summarize:

空间复杂度和时间复杂度分析过程大致相同,我认为他们是鱼和熊掌的关系,不可能同时并存。

小结:

  trade off很关键,我认为正如CAP一样:“一个分布式系统不可能同时很好的满足 一致性,可用性和分区容错性这三个需求”,我认为在时间和空间复杂度上,一个算法也不能很完美的结合两者,重要的还是视业务情况而定。开始整合一些数据结构和算法的概念,只是按照自己的理解写的(大神请不吝指点),会在之后的章节中《算法和数据结构》进行更深层次的研究和探讨。

时间&空间(complexity)的更多相关文章

  1. TRIZ发明问题解决理论——本质是分析问题中的矛盾,利用资源(时间空间物质能量功能信息等)来解决矛盾从而解决问题——抽象出来:问题是什么,为什么?

    TRIZ意译为发明问题的解决理论.TRIZ理论成功地揭示了创造发明的 内在规律和原理,着力于澄清和强调系统中存在的矛盾,其目标是完全解决矛盾,获得最终的理想解.它不是采取折衷或者妥协的做法,而且它是基 ...

  2. layDate/DatePicker日期时间空间

    真心不错,果断收藏了. 1.示例与效果 2.更多示例与皮肤 补充说明:My97DatePicker日期时间插件 的使用 1.示例与效果 2. 更多 常用的实例:WdatePicker下载 http:/ ...

  3. S-HR之时间空间配置

    <field name="entrys.bizDate"   dataType = "DATE"  label="生效日期" year ...

  4. Redis学习笔记~关于空间换时间的查询案例

    回到目录 空间与时间 空间换时间是在数据库中经常出现的术语,简单说就是把查询需要的条件进行索引的存储,然后查询时为O(1)的时间复杂度来快速获取数据,从而达到了使用空间存储来换快速的时间响应!对于re ...

  5. Redis基础知识之————空间换时间的查询案例

    空间与时间 空间换时间是在数据库中经常出现的术语,简单说就是把查询需要的条件进行索引的存储,然后查询时为O(1)的时间复杂度来快速获取数据,从而达到了使用空间存储来换快速的时间响应!对于redis这个 ...

  6. java性能时间与空间消耗

    Java性能时间与空间消耗 一.减少时间消耗 标准代码优化 (1) 将循环不变量的计算移出循环 例如:for (int i=0; i<size()*2; i++) { ... } ------& ...

  7. My97DatePicker时间控件使用

    刚刚工作中遇到一个修改时间空间的bug,顺带学习了My97DatePicker时间空间 网上查到的资料已经很详细: http://www.360doc.com/content/14/0606/11/1 ...

  8. 时间处理总结(三)javascript与WCF

    1.WCF提交时间时,若需接受DateTime需转换为"\/Date(928120800000+0800)\/"这种格式 var DateToJson = function (js ...

  9. FS 日志空间限定

    一.说明: FS默认安装的log文件,仅仅的限制了每个文件的大小,但是没有限制文件的个数.这种情况下,在FS运行很长时间之后,会出现物理空间不够的情况,导致FS或者mysql 或者其他应用没有空间使用 ...

随机推荐

  1. Python import本地模块

    无法识别本地模块 在pycharm中选择文件夹Mark Directory as -> Source root. 或者使用sys.path.append()添加文件夹路径 还是报错ImportE ...

  2. 如何使用 js 实现一个 throttle 函数

    如何使用 js 实现一个 throttle 函数 原理 实现方式 "use strict"; /** * * @author xgqfrms * @license MIT * @c ...

  3. HTTP/HTTPS Proxy & Charles

    HTTP/HTTPS Proxy & Charles Charles https://www.charlesproxy.com/ https://www.jianshu.com/p/53d2c ...

  4. js滚轮事件兼容写法

    /** * 简易的事件添加方法 */ define(function(require, exports, module) { exports.addEvent = (function(window, ...

  5. BGV再掀DeFi投资热潮,NGK全球启动大会圆满落幕

    此次全球启动大会的主题为"BGV再掀DeFi投资热潮,后市发展如何". 首先发言的是NGK灵石团队首席技术官STEPHEN先生,他先是对出席此次大会的嘉宾.到场的媒体记者以及NGK ...

  6. (十一) 数据库查询处理之连接(Join)

    (十一) 数据库查询处理之连接(Join) 1. 连接操作的一个例子 把外层关系和内层关系中满足一定关系的属性值拼接成一个新的元组 一种现在仍然十分有用的优化思路Late Materializatio ...

  7. 模拟web服务器 (小项目) 搭建+部署

    模拟web服务器:可以从浏览器中访问到自己编写的服务器中的资源,将其资源显示在浏览器中. 技术选型: corejava 线程池 同任务并发执行 IO流 传递数据 客户端也会像服务端发送数据, 服务器像 ...

  8. SpringBoot读取配置文件的内容

    1.@Value读取 在springboot项目中,如果要读取配置文件application.properties或application.yml文件的内容,可以使用自带的注解@Value.以prop ...

  9. JUnit5学习之五:标签(Tag)和自定义注解

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  10. mysql锁——innodb的行级锁

    [前言]数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则.MySQL数据库由于其自身架构的特点,存在多种数据存储引擎,每种存储引擎所针对的应 ...