数据结构和算法(一):时间复杂度和空间复杂度

算法是一系列程序指令,用于处理特定的运算和逻辑问题,衡量一个算法是好是劣,一般是看这个算法的时间复杂度和空间复杂度。时间复杂度决定了算法运行的时间长短。空间复杂度决定了计算时所需的资源多少,一般量着难兼顾,大多数情况下会优先缩短运行时间。

1、时间复杂度
一个算法执行的时间,从理论上是不能算出来的,只能运行测试出来,但是我们并不需要对每个算法都测试一遍来判断好坏,只需要知道哪个算法花费时间多还是少就行了。算法运行的时间于算法中的语句执行次数成正比,执行的次数越多,花费的时间就越长。
时间复杂度一般记作O。下面几个例子很好的说明了时间复杂度的比较。
eg1:一个长10cm的面包,每3min吃掉1cm,那么,全部吃完要多久?(以n表示面包长度)
答案:T(n)=3n
eg2:一根16cm的面包,每5min吃掉一半,那么面包吃的只剩1cm时,需要多久?
答案:T(n)=5logn
eg3: 一个长10cm的面包和1个鸡腿,每2min吃掉1个鸡腿,请问吃掉鸡腿要多久?
答案:T(n)=2
eg4:一根10cm的面包,吃掉第1个1cm要1min,吃掉第2个1cm要2min,以此类推,吃掉整个面包需要多久?
答案是T(n)=0.5n^2+0.5n
若存在函数f(n),使得当n趋近无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数,记作T(n)=O(f(n)),O称为时间复杂度。
如何推到时间复杂度?
(1)如果运行时间是常数量级,则用常数1标识
(2)只保留时间函数中的最高阶项
(3)如果最高阶项存在,则省去最高阶项前面的系数
所以,在前面的例子中,eg1:T(n)=3n——》T(n)=O(n)
eg2:T(n)=5logn——>T(n)=O(logn)
eg3:T(n)=2——》T(n)=O(1)
eg4:T(n)=0.5n2+0.5n——》 T(n)=O(n^2)
当n的取值足够大时,有O(1)<O(logn)<T(n)=O(n)<O(n^2)
2、空间复杂度
空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度,算法的输入输出数据占用的存储空间是由要解决的问题决定的,是通过参数表由调用函数传递而来的,它不随本算法的不同而改变。
和时间复杂度类似,空间复杂度也有几种不同的增长趋势。
eg1:常量空间——当算法的存储空间大小固定,和输入规模没有直接的关系时,空间复杂度记为O(1)
eg2:线性空间——当算法分配的空间是一个线性集合(如数组),并且集合大小和输出规模n成正比时,空间复杂度记作O(n)
eg3:二维空间——当算法分配的是一个二维数组集合,并且集合的长度和宽度都与输入的规模n成正比,空间复杂度记作O(n^2)
eg4:递归空间——递归是一个比较特殊的场景,虽然递归代码中并没有显式地声明变量或集合,但是计算机在执行程序时,会专门分配一块内存,用来存储“方法调用栈”
“方法调用栈”包括进栈和出栈两个行为。
当进入一个新方法时,执行入栈操作,把调用的方法和参数信息压入栈中。
当方法返回时,执行出栈操作,把调用的方法和参数信息从栈中弹出。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值