时间复杂度与空间复杂度
@TOC
一、时间复杂度
1.概念
即时间复杂度计算的是执行次数
2.大 O 的渐进表示法
1.用常数 1 取代时间中的所有加法常数 2.在修改后的运行次数函数中,只保留最高项 3.如果最高项存在而且不是 1,则去除与这个项目相乘的常数,得到的结果就是大 O 阶
3.练习题
1.常规情况
正常来说,操作次数应为 o(N^2)+o(2*N)+o(M),但是只保留 o(N ^2)但若 N 为一个很大的数 如 100000,平方后为 10000000000,就不会在意后面的几千几百的附加值了
操作次数为 O(2*N)+10,但只保留 O(N)如果 N 为一个很大的数,如 100000,加一个常数区别不大,所以就不需要加上了同理,一个数的 2 倍对于本身影响也不是很大,所以也会忽略掉
操作次数为 O(1) ,因为 100 是常数次用 1 代替
2.特殊情况
本题也再次证明了并不是所有双 for 循环都是 O(N^2),假设有 n 个数,处于最坏情况下冒泡排序是先通过第一个数与后面的数依次比较,比较次数为 n-1 然后变为第二个数与后面的数比较,比较次数为 n-2 直到交换次数为 1 时完成冒泡排序操作次数为 1 +2+3+......+n-2+n-1 通过等差数列计算为 n(n-1)/2 即 O(N^2)最好的情况下为有序,执行 n-1 次就结束了,即 O(N)
我们所知道的二分查找,每次都取半,如果 mid 的值大于想要取得值 k 则右边界取 mid-1,若 mid 值小于想要取得值 k,则左边界取 mid+1 假设元素个数为 N 个则 为 N/2/2/2....../2=1 反之为 1* 2* 2 * 2 * 2 .....* 2=N 设 x 为操作次数 即 2^x=Nx=log 2 N 依照规则忽略 即 O(log N)
假设为 3 时得递归展开图
可以看出当 N 为 3 时 ,一共递归了 3 次,每次递归函数调用一次即时间复杂度为 O(N)
二、空间复杂度
1.概念
即创建变量的个数
2.用法
这里的空间复杂度为 O(1)因为变量的个数为常数个,所以在大 O 的渐进法中为 O(1)
这道题因为 malloc 动态开辟了 n+1 个空间所以空间复杂度为 o(n)
版权声明: 本文为 InfoQ 作者【lovevivi】的原创文章。
原文链接:【http://xie.infoq.cn/article/fc1e890a8c3a07ecfa8298253】。文章转载请联系作者。
评论