数据结构之时间复杂度和空间复杂度

       我们知道数据结构是实现存储、组织数据并进行数据管理的一种形式,而算法是必不可少的。像线性表、栈、队列、矩阵、红黑树、排序、B树......都是算法。或者在解决同一问题如排序问题时可以运用多种算法:冒泡、插排、快排.......

       那么究竟哪种算法更简洁,程序的运行效率更高,主要从两个方面比较:时间复杂度和空间复杂度。

一、时间复杂度

       时间复杂度顾名思义就是测量一个算法在解决某实际问题时所需时间,而该时间和此算法的执行次数成正比。也就是说,一个算法所执行的次数越少就越好。

1.大O渐进表示法

       大O(Big O notation)适用于描述函数渐进行为的数学符号。最好情况1次找到,最坏情况N次找到,平均次数任意输入期望的执行次数。定义n为次数趋近于正无穷,相应的有o(1)常数有限次,o(n),o(n^2),o(logn),o(nlogn),o(n^3),o(2^n)......对于计算机每秒上亿次的程序运算,通常认为当o()超过n^2时,此算法的运行效率不高。

2.时间复杂度相应的OJ练习

       求第n个数的斐波那契数,如果用递归实现相应的时间复杂度是o(2^n),由于其指数爆炸的特性,n的数不能太大。以VS2022在联想拯救者i9-4060测试下,当n=40时的运行时间为1~2s,n= 50时运行时间会在15s以上。故此在求解此类问题时应使用迭代的方法解决,其为o(n)。

       轮转数组思路1:将为数组的值存到tmp变量,而后一一把原数组的值赋值到下一位(轮转几次就循环几次),再将tmp的值保存到数组首元素位置。此方法在leetcode会超出时间限制。思路2:实现三段逆置。数组整体逆置一次,再数相应的轮转次数位分前后逆置两次。从时间复杂度来说思路2的方法更好。

       https://leetcode.cn/problems/rotate-array/description/

       消失的数字思路1:创建一个从0~n的数组求和ret,求原数组的和sum,消失的数字=ret - sum  思路2:创建一个从0~n的数组和原数组进行异或(^),最后的值就是消失的数字。

       https://leetcode.cn/problems/missing-number-lcci/

3.计算时间复杂度大体规则

       计算时间复杂度大体规则是常数次o(1)。当n趋于无穷时只保留计算次数结果的最高次项,最高次项的系数不保留。如果有两个及以上变量:如m和n,其最高次项的次数均为1其时间复杂度为o(m+n)。

二、空间复杂度

       相较于时间复杂度,空间复杂度就显得不是那么重要。如今的内存大多都在8G,16G甚至32G比如:1TB=1024GB=1024^2MB=1024^3KB,存储空间的扩大大大减少了空间复杂度对算法评判的影响。但空间复杂度仍然无可厚非。

       空间复杂度是算法临时占用存储空间大小的量度,算的不是占用byte的个数(没有太大的意义)而是计算变量的个数,使用的仍然是大O渐进表示法。此外开辟额外的栈帧也会增加空间复杂度。

       大体规则:有常数个变量空间复杂度是o(1)。程序运行时开辟了n个额外的空间空间复杂度是o(n)。递归调用了n次,开辟了n个栈帧,每个栈帧使用了常数个空间其空间复杂度是o(n)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值