时间&空间复杂度

  时间复杂度:

通俗来说就是随着数据量的增加,程序运行的时间花费量是怎么变化的时间复杂度常用大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. spring boot集成mybatis只剩两个sql 并提示 Cannot obtain primary key information from the database, generated objects may be incomplete

    前言 spring boot集成mybatis时只生成两个sql, 搞了一个早上,终于找到原因了 找了很多办法都没有解决, 最后注意到生成sql的时候打印了一句话: Cannot obtain pri ...

  2. macOS & Catalina vs Big Sur

    macOS & Catalina vs Big Sur 乍一看,macOS的色彩更加丰富,最大的变化就是明亮,略带卡通风格的iOS形状的图标. 一切都变得更加圆润,感觉一切都变得更大了. 这可 ...

  3. Tumult Hype

    Tumult Hype hype generated script https://tumult.com/hype/documentation/ HTML5 animation editor http ...

  4. free open movie API all in one

    free open movie API all in one movie API TMDb API The Movie Database https://www.themoviedb.org/docu ...

  5. HTTPS clone !== SSH clone

    HTTPS clone !== SSH clone https clone bug SSH clone OK testing SSH key https://www.cnblogs.com/xgqfr ...

  6. svg rect to polygon points & points order bug

    svg rect to polygon points & points order bug https://codepen.io/xgqfrms/pen/vYOWjYr?editors=100 ...

  7. ToolBar 用法

    xml中的设置: <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_wi ...

  8. 01.Numpy数组的基本应用

    数组的创建 数组的访问 数组的合并 数组的分割 数组创建 >>> import numpy as np 创建一维数组 >>> x = np.arange(10) & ...

  9. MySQL命名、设计及使用规范

    本文转载自MySQL命名.设计及使用规范 导语 最近在看MySQL相关的内容,整理如下规范,作为一名刚刚学习MySQL的菜鸟,整理的内容非常的基础,中间可能涉及到有错误的地方,欢迎批评指正,看到有错误 ...

  10. spring扩展点整理

    本文转载自spring扩展点整理 背景 Spring的强大和灵活性不用再强调了.而灵活性就是通过一系列的扩展点来实现的,这些扩展点给应用程序提供了参与Spring容器创建的过程,好多定制化的东西都需要 ...