算法的空间复杂度和空间复杂度

一 . 简介

复杂度是衡量算法好坏的一个刻度尺

快/慢就是时间复杂度

使用空间(内存)就是空间复杂度

二 . 时间复杂度

我们知道, CPU每秒运行的指令数是恒定的, 衡量算法快慢的标准就是算法运行的基本指令个数, 运行指令个数f(n)和数据规模n有关

现在来了解一下大O渐进法, 这个方法就是极限的方法, 在大O符号表示法中, 时间复杂度的公式是 : T(n) = O(f(n)), 来看一个例子

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

假设每行代码的执行时间是一样的, 第一行耗时1, 第二行耗时n, 第三行耗时n, 那么总的时间复杂度就是(1 + 2n), 而算法的耗时是随着n的变化而变化的, 当n无限大的时候, 常量1就没有意义了, 倍数2的意义也不大, 所以简化为O(n). 事实上, 大O符号表示法并不是代表算法的真实运行时间, 而是表示代码执行时间的增长变化趋势. 

常见的时间复杂度有 O(1), O(log(n)), O(n), O(n*log(n)), O(n^2), O(2^n)  (按时间复杂度从小到大排序)

O(1) : 无论代码执行了多少行, 只要没有复杂的结构, 它的时间复杂度就是1

O(log(n)) : 常见的二分查找复杂度

O(n) : 简单for循环中常见

举例 : 

1. O(1)

int i = 1;
int j = 2;
++i;
++j;
int m = i + j;

上述代码在执行的时候, 它消耗的时间并不随着某个变量的增长而增长, 那么无论这类代码有多长, 即使有几十万行, 都可以用O(1)来表示它的时间复杂度

2. O(n)

前面的例子就是这样, for循环里的代码会执行n遍, 因此它消耗的时间是随着n的变化而变化的, 因此这类代码都可以用O(n)来表示它的时间复杂度

3. O(log(n))

int i = 1;
while(i < n){
    i = i * 2;
}

可以看到, 在while循环里面, 每次都将 i 乘以 2 , 乘完之后, i 距 n的距离越来越近了, 我们试着求解, 假设循环x次后, i 就大于2, 此时这个循环就退出了, 也就是2 的 x 次方等于 n, 那么 x = log2^n, 也就是说循环log2^n次之后, 这个代码就结束了, 因此这个代码的时间复杂度为O(log(n))

4. O(nlog(n))

线性对数阶就是将时间复杂度为O(nlog(n))的代码循环n次

    for(m =1;m<n;m++){
        i = 1;
        while (i < n) {
            i = i * 2;
        }
    }

5. O(n²) (冒泡排序的时间复杂度)

就是把时间复杂度为O(n)的代码再嵌套循环一次, 时间复杂度就是O(n²)

for(x=1; i<=n; x++){
   for(i=1; i<=n; i++){
       j = i;
       j++;
    }
}

三. 空间复杂度

现在我们知道了, 时间复杂度不是用来计算程序具体耗时的, 那么, 空间复杂度也不是用来计算程序实际占用的空间的

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的一个量度, 同样反映的是一个趋势. 空间复杂度的公式是 : S(n) = O(f(n))

常见的空间复杂度有 : O(1), O(n), O(n²)

1. O(1)

如果算法执行所需要的临时空间不随着某个变量n的大小而变化, 即空间复杂度为O(1)

int i = 1;
int j = 2;
++i;
++j;
int m = i + j;

2. O(n)

int[] m = new int[n]
for(i=1; i<=n; ++i){
   j = i;
   j++;
}

这段代码中, 第一行就new了一个数组出来且这个数组占用的大小为n, 后面的代码虽然有循环, 但是没有再分配新的空间, 所以空间复杂度只看第一行就可以

四. 总结

时间复杂度大O渐进法 : (1)只保留最高次项 (2)最高次项系数化为1

空间复杂度大O渐进法 : (1)计算额外使用的空间大小, 不考虑输入输出中用到的空间 (2)常见形式: int[] array = new int[]

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值