空间复杂度问题

为什么同样都是用递归, 有的空间复杂度是O(logn),有的是O(N)呢,我是这么理解的,可能不对,大家给指导下,如果是递归中的参数+1或者-1这种的,因为递归要占用栈空间,所以空间复杂度为O(n),如果是一半一半的递归,因为每次减半深度只有logn所以是O(logn),使用栈空间的深度是多少,空间复杂度就是多少么?比如有的时候,如果递归太深,程序崩溃,是因为占用栈的空间太多,没能释放引起的么,这里是方法栈没能释放么,如果我理解的不对,那么我们所说的递归开辟栈空间所以空间复杂度为O(n)怎么理解呢?

答案
溢出的意思就是越界,操作系统会给每个进程分配一个最大上限的堆栈空间,如果超过了这个内存空间大小程序就会coredump,就像你使用int *pi = new int[100000000];会崩溃一样,因为这里堆溢出了。
操作系统分配给一个进程的栈空间是2M,堆空间在32位机器上是4G。如果你的进程的栈空间使用超过了2M就会栈溢出,堆使用超过4G就会堆溢出。
那么递归为什么会导致栈溢出呢?栈的规则是先入后出,递归的话那么先入的一定不能出栈,会一致存在栈空间中,这样就容易导致栈满而溢出。

每当你调用一个函数,在这个函数执行前都会将之前的代码地址(也就是调用点)入栈,等被调用的函数执行完将地址出栈,程序根据这个数据返回调用点。
若递归调用次数太多,就会只入栈不出栈,于是堆栈就被压爆了,此为栈溢出。
递归的层度太多了却还没有到达结束条件,以至于超出了系统所能承受的程度。
在这里插入图片描述
在这里插入图片描述

int占用4字节,一个字节8个bit位, 所以是32比特,2^ 32位 数据范围为-2147483648~ 2147483647[-2^ 31 ~ 2^ 31 -1]
int 占 4个字节 一个字节为1B(byte)
1024B=1KB ;1024KB=1MB ;1024MB=1GB
32位是说总线有32根,根据每根高低电平的不同可以有2的32次方种不同情况,也就可以确定2的32次方次不同的线路,到达2的32次方次个内存单元,每个内存单元是1B,也就是4GB
2^ 32(Byte)=2^32(Byte) /1024/1024/1024=4GB 即2的32个Bytes占用的内存是4GB

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值