Fork me on GitHub

时间复杂度与空间复杂度

时间复杂度与空间复杂度是算法中的概念。
时间复杂度T(n) = O(f(n))=>T(Time);O(这里是大写字母O,并不是用于来真实代表算法的执行时间,而是用来表示代码执行时间的增长变化趋势);n(代表影响复杂度的因子); f(n)代表复杂度的具体算法
空间复杂度S(n) = O(f(n))=>S(Space)
所谓时间复杂度,就是算法的运算时间,通过代码的执行次数来表示。
所谓空间复杂度,就是算法在运算过程中占用的临时空间。

常见的时间复杂度量级:
①常数阶 O(1)

int a = 11;
int b = 22;

这就是常见的变量定义,上面的代码执行时间并不会随着某个变量的增长而增长,因此复杂度就是O(1)。

②线性阶O(n)

for(int i = 0;i<n;i++){
      a++;
}

循环体内的每一行代码都会执行n次,此算法的复杂度为O(n).

③对数阶O(logn)

while(a<n){
a = a*2;
}

每次循环都会*2,因此总共的循环次数为log2n,但因为n数据规模才是影响复杂度的关键,因此忽略底数,复杂度为O(logn)

④线性对数阶O(nlogn)

for(int i = 0;i<n;i++){
      while(a<n){
      a = a*2;
}

这里就是将复杂度为O(logn)的代码循环执行n次。

⑤平方阶O(n²)

for(int i = 0;i<n;i++){
   for(int j = 0;j<n;j++){
      a++;
   }   
}

这里将复杂度为O(n)的代码再嵌套循环一遍,时间复杂度就是 O(n²)了。

立方阶O(n³) K次方阶O(n^k) 与平方类似,几次方就嵌套循环几次。

空间复杂度
①O(1)

int x = 1;
int y = 2;

上面,分配的内存空间不变的,就是O(1)

②O(n)
int[] arr = new int[n];
上面,分配的内存空间会随着n改变的,就是O(n)

posted @ 2020-07-01 11:42  madman98  阅读(119)  评论(0编辑  收藏  举报