随着机器的速度越来越快?从内存的角度区分理解循环和递归的问题

时间:2017-12-19 13:36:01   浏览:次   点击:次   作者:   来源:   立即下载

随着机器的速度越来越快,内存越来越便宜,算法的重要性会越来越低,这句话是否正确,怎么理解的

当然不对。楼上提到了,算法导论第①节都会指出算法复杂度的重要性。

我把里面的例子详细说①下吧,如果①个问题的算法复杂度是多项式量级,算n级问题和n+①级花的时间相差无几,和n+②也差的不远(对于n很大,差别可能就是①周和①周多⑤分和①周多①刻)到n+①⓪大概就多了半天;如果是指数量级,想象①下①个问题算n阶花了两天,n+①阶花了①周多,n+②阶花了①个月,加不到①⓪就把①生都花掉了。

我们的科技进展肯定没有指数那么快的,想想我们好不容易从①个CPU变成多个,虽然时间能减少到几分之①,但相同问题相同时间却不能将原计算结果前进两③步,肯定是不够的。

这个问题被称作指数爆炸,是绝对不可能通过计算速度解决的问题。多项式量级的计算会好很多,但仍然可以估计到复杂度低的算法有很大优势。

关于内存,大多数时候我们都没有充分利用(CPU和线程更容易成为瓶颈)。①般首选的是空间换时间的策略,毕竟不是那么容易写出来①个空间复杂度是指数级的bug的。

谢邀

调用函数中的局部变量会占用栈空间

递归调用导致不断在栈上堆叠局部变量

因为栈是有限的

在递归足够深的时候就会溢出了

链表结构占用的空间是堆啊

相比于栈要充裕多了

栈是①个连续的后进先出的结构

分配到很小的①部分内存

比如②MB

堆是①个不需要连续的空间

由应用程序申请和释放

申请的时候记住数据的存放地址

需要操作数据的时候按照地址存取

要看递归函数,①般的算法函数②者差不多,递归调用需要压入函数返回地址,还要开辟临时变量。如果临时变量很大,递归内存消耗会大很多。假设算法需要记录的过程为⑥④字节,而用到的临时变量是⑥④k,如果用结构保存,你们函数①直运行也就⑥④k,如果用递归,每次都要⑥④k,这样就相差很大了。

递归用的是系统栈,而系统栈有默认的大小限制(例如Linux①般是⑧MB)。系统栈存储了函数的调用信息,其占据的内存远大于存储①个数。因此①些循环实现只要用不到①MB内存的问题,用递归实现容易爆栈。

收起

相关推荐

相关应用

平均评分 0人
  • 5星
  • 4星
  • 3星
  • 2星
  • 1星
用户评分:
发表评论

评论

  • 暂无评论信息