时间&空间(Complexity)

时间&空间复杂度

  时间复杂度:

通俗来说就是随着数据量的增加,程序运行的时间花费量是怎么变化的时间复杂度常用大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一样:“一个分布式系统不可能同时很好的满足 一致性,可用性和分区容错性这三个需求”,我认为在时间和空间复杂度上,一个算法也不能很完美的结合两者,重要的还是视业务情况而定。开始整合一些数据结构和算法的概念,只是按照自己的理解写的(大神请不吝指点),会在之后的章节中《算法和数据结构》进行更深层次的研究和探讨。

原文地址:https://www.cnblogs.com/UpGx/p/14457334.html