时间复杂度 和 空间复杂度

 《数据结构和算法》中时间复杂度空间复杂度都是衡量程序效率的一种方式。


一、时间复杂度: 衡量的是程序运行的快慢。

  1. 衡量时间复杂度的时候,需要先确定基本操作(执行次数最多的典型操作)是啥,可能是++,可能是赋值,也可能是读取,还有可能是打印等。其次利用大O的渐进表示法粗略的描述问题发展的趋势。(执行次数和复杂度成正比,不是精确)
  2. 大O的渐进表示法:计算基本操作执行的次数,保留最高阶项,同时去掉系数,得到了一个用来衡量复杂杜的“近似值”,用O()表示。

例:

    void func(int N){
        int count=0;
        for (int i=0;i<N;i++){
            for (int j=0;j<N;j++){
                count++;//执行N^2次
            }
        }
        for (int k=0;k<2*N;k++){
            count++;//执行2N次
        }
        int M=10;
        while((M--)>0){
            count++;//执行10次
        }
        System.out.println(count);
    }

执行次数最多的典型操作是count++

总共执行   N^2+2*N+10  次;

实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行的次数,而只需要大概执行次数,那么这里我们使用大O的渐进表示法。func的时间复杂度为:

O(N^2)

ps:

O(1)不一定比O(N)要快。(只是粗略的描述问题发展的趋势)


二、空间复杂度: 衡量的是程序占用内存/外存的大小。

        空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度。空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。空间复杂度计算规则基本跟时间复杂度类似,也使用大O渐进表示法。

利用冒泡排序举例空间复杂度:

void bubbleSort(int[] array){
        for (int end=array.length;end>0;end--){//end是一份额外空间
            boolean sorted=true;
            for (int i=1;i<end;i++){//i是一份额外空间
                if(array[i-1]>array[i]){
                    Swap(array,i-1,i);//Swap是一份额外空间(Swap是交换元素位置的方法)
                    sorted=false;
                }
            }
            if (sorted=true){
                break;
            }
        }
    }

bubbleSort的空间复杂度为:

O(1)

总结:铁打的营盘(内存),流水的兵(数据)。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值