时间&空间复杂度

  时间复杂度:

通俗来说就是随着数据量的增加,程序运行的时间花费量是怎么变化的时间复杂度常用大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. 为树莓派3B添加LCD1602液晶屏

    树莓派3B针脚说明 LCD1602接线说明 VSS,接地VDD,接5V电源VO,液晶对比度调节,接电位器中间的引脚,电位器两边的引脚分别接5V和接地.RS,寄存器选择,接GPIO14RW,读写选择,接 ...

  2. 操作系统 part2

    一.程序的内存结构 references: newcoder 运行时,程序分为:text段.data段.BSS段(2个合称数据段).堆.栈. text段:代码段,静态分配内存,只读. data段:初始 ...

  3. PHP 标记官方简明教程; <?php 和 ?> 与 <?php 的使用场景!

    PHP 标记官方简明教程:  <?php 和 ?> 与 <?php  的使用场景! 1 PHP 标记¶ 当解析一个文件时,PHP 会寻找起始和结束标记,也就是 <?php 和  ...

  4. how to enable vue cli auto open the localhost url

    how to enable vue cli auto open the localhost URL bad you must click the link by manually, waste of ...

  5. Github App version released icons

    # Github App version released icons http://shields.io/ Build Travis: https://img.shields.io/travis/U ...

  6. js array flat all in one

    js array flat all in one array flat flatMap flatMap > flat + map https://developer.mozilla.org/en ...

  7. JSDoc in action

    JSDoc in action JSDoc https://jsdoc.app/index.html https://github.com/jsdoc/jsdoc $ npm -g jsdoc $ n ...

  8. React In Depth

    React In Depth React Component Lifecycle https://reactjs.org/docs/react-component.html https://react ...

  9. SSL/TLS协议详解(下)——TLS握手协议

    本文转载自SSL/TLS协议详解(下)--TLS握手协议 导语 在博客系列的第2部分中,对证书颁发机构进行了深入的讨论.在这篇文章中,将会探索整个SSL/TLS握手过程,在此之前,先简述下最后这块内容 ...

  10. dotnet core TargetFramework 解析顺序测试

    dotnet core TargetFramework 解析顺序测试 Intro 现在 dotnet 的 TargetFramework 越来越多,抛开 .NET Framework 不谈,如果一个类 ...