简单理解时间复杂度和空间复杂度
一、时间复杂度
执行当前算法所消耗的时间,我们通常用时间复杂度来描述。
常见的时间复杂度量级
常数阶O(1)
对数阶O(logN)
int i=1; while(i<n) { i=i*2; }
线性阶O(n)
for(int i=0;i<=n;i++) { j=i; j++; }
线性对数阶O(nlogN)
for(m=1;m<n;m++) { i=1; while(i<n) { i=i*2; } }
平方阶O(n^2),比如冒泡排序
for (int i = 0; i < arrLength; i++) { for (int j = 0; j < arrLength-i-1; j++) { if (arr[j] > arr[j + 1]) { //交换arr[j]和arr[j + 1]的值 int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } }
立方阶O(n^3)
K次方阶O(n^k)
指数阶(2^n)
二、空间复杂度
空间复杂度是对一个算法在运行过程中临时占用存储空间大小的一个量度,同样反映的是一个趋势,我们用 S(n) 来定义。
常见的空间复杂度
空间复杂度比较常用的有:O(1)、O(n)、O(n²)
空间复杂度O(1)
如果算法执行所需要的临时空间不随着某个变量n的大小而变化,即此算法空间复杂度为一个常量,可表示为 O(1)
int i=1; int j=2; ++i; j++; int m=i+j;
代码中的 i、j、m 所分配的空间都不随着处理数据量变化,因此它的空间复杂度 S(n) = O(1)
空间复杂度O(n)
int[] m=new int[n]; for(i=1;i<n;i++) { j=i; j++; }
new一个数组,这个数据占用的大小为n,下面虽然有循环,但没有再分配新的空间,因此,这段代码的空间复杂度主要看第一行即可,即 S(n) = O(n)
浙公网安备 33010602011771号