建手机网站价格,城乡建设部官方网站,商城网站建设策划书,为wordpress创建一个ftp一、定义时间和空间是程序的一个硬性指标#xff0c;一个用来衡量 代码执行的速度 #xff0c;一个用来衡量 存储空间的大小程序 数据结构 算法时间复杂度#xff1a;就是执行程序的快慢#xff0c;速度越快#xff0c;时间复杂度就越好。空间复杂度#xff1a;就是执… 一、定义时间和空间是程序的一个硬性指标一个用来衡量 代码执行的速度 一个用来衡量 存储空间的大小程序 数据结构 算法时间复杂度就是执行程序的快慢速度越快时间复杂度就越好。空间复杂度就是执行程序需要的存储空间的大小执行程序需要的存储空间越小就越好。二、时间复杂度的计算表示方法我们一般用 大O符号表示法来表示时间复杂度T(n) O(f(n)) n是影响复杂度变化的因子f(n)是复杂度具体的算法。常见的时间复杂度量级常数阶O(1)线性阶O(n)对数阶O(logN)线性对数阶O(nlogN)平方阶O(n²)立方阶O(n³)K次方阶O(n^k)指数阶(2^n)接下来再看一下不同的复杂度所对应的算法类型。常数阶O(1)int a 1;
int b 2;
int c 3;
123
我们假定每执行一行代码所需要消耗的时间为1个时间单位那么以上3行代码就消耗了3个时间单位。那是不是这段代码的时间复杂度表示为O(n)呢 其实不是的因为大O符号表示法并不是用于来真实代表算法的执行时间的它是用来表示代码执行时间的增长变化趋势的。上面的算法并没有随着某个变量的增长而增长那么无论这类代码有多长即使有几万几十万行都可以用O(1)来表示它的时间复杂度。线性阶O(n)for(i 1; i n; i) {j i;j;
}
1234
看这段代码会执行多少次呢第1行会执行1次第2行和第3行会分别执行n次总的执行时间也就是 2n 1 次那它的时间复杂度表示是 O(2n 1) 吗No ! 还是那句话“大O符号表示法并不是用于来真实代表算法的执行时间的它是用来表示代码执行时间的增长变化趋势的”。所以它的时间复杂度其实是O(n);对数阶O(logN)int i 1;
while(i n) {i i * 2;
}
1234
可以看到每次循环的时候 i 都会乘2那么总共循环的次数就是log2n因此这个代码的时间复杂度为O(logn)。这儿有个问题为什么明明应该是O(log2n,却要写成O(logn)呢其实这里的底数对于研究程序运行效率不重要写代码时要考虑的是数据规模n对程序运行效率的影响常数部分则忽略同样的如果不同时间复杂度的倍数关系为常数那也可以近似认为两者为同一量级的时间复杂度。线性对数阶O(nlogN)for(m 1; m n; m) {i 1;while(i n) {i i * 2;}
}
123456
线性对数阶O(nlogN) 其实非常容易理解将时间复杂度为O(logn)的代码循环N遍的话那么它的时间复杂度就是 n * O(logN)也就是了O(nlogN)。平方阶O(n²)for(x 1; i n; x){for(i 1; i n; i) {j i;j;}
}
123456
把 O(n) 的代码再嵌套循环一遍它的时间复杂度就是 O(n²) 了。立方阶O(n³)、K次方阶O(n^k)参考上面的O(n²) 去理解就好了O(n³)相当于三层n循环其它的类似。三、空间复杂度计算空间复杂度 O(1)如果算法执行所需要的临时空间不随着某个变量n的大小而变化即此算法空间复杂度为一个常量可表示为 O(1)。int i 1;
int j 2;
i;
j;
int m i j;
12345
代码中的 i、j、m 所分配的空间都不随着处理数据量变化因此它的空间复杂度 S(n) O(1)。空间复杂度 O(n)int[] m new int[n]
for(i 1; i n; i) {j i;j;
}
12345
这段代码中第一行new了一个数组出来这个数据占用的大小为n后面虽然有循环但没有再分配新的空间因此这段代码的空间复杂度主要看第一行即可即 S(n) O(n)。总结评价一个算法的效率主要是看它的时间复杂度和空间复杂度情况。可能有的开发者接触时间复杂度和空间复杂度的优化不太多尤其是客户端但在服务端的应用是比较广泛的在巨大并发量的情况下小部分时间复杂度或空间复杂度上的优化都能带来巨大的性能提升是非常有必要了解的。大家好下面是我的另一个号会发一些比较私密的内容欢迎大家关注