2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 【萌味】小夕说 不了解动态空间增长的程序喵都是假喵(上)

【萌味】小夕说 不了解动态空间增长的程序喵都是假喵(上)

时间:2022-08-23 00:03:09

相关推荐

【萌味】小夕说 不了解动态空间增长的程序喵都是假喵(上)

小提示:小夕会将小屋的最新动态更新到小屋的布告栏哦,口令是【nb】(口令在订阅号主界面直接回复即可使用)。

小夕学了数据结构后,知道了链表、树、哈希表等数据结构与静态数组的固定容量不同,它们是可以动态添加元素的。这种数据结构的初始大小可能很小,甚至几乎为零,但是随着新元素的加入,其大小(内存空间占用)会不断增长,这个过程就叫做动态空间增长。那么问题来了,所有支持动态空间增长的数据结构都是相同的增长方式吗?了解这个又有什么意义呢?

前言

小夕曾经很傻很天真的认为所有支持动态空间增长的数据结构都是每增加一个元素,数据结构的大小就增加1个单位。直到在一个中规模机器学习任务的数据预处理过程中遇到了“内存爆炸”的问题,即小夕明明计算的内存够用,但是小夕可怜的电脑的内存却意外爆满了。最终小夕在某大神的指导下才知道原来数据结构的容量还能是加倍加倍的扩!小夕瞬间感到自己的智商可能只剩23.333了。

作为程序喵,不能光讲大道理。小夕为了避免讲解太过抽象,如果您是C++程序喵,那么请注意一下Vector数据结构;如果是Java程序喵,请注意一下ArrayList、LinkedList、哈希系列(HashSet/HashTable/HashMap);如果是不用Java也不用C++的程序喵,或者是已经脱离XX编程语言层次的程序喵,那么请注意一下可变数组(可增长顺序表)、链表、哈希(散列)。小夕将基于上面这些程序喵肯定知道的东西来花式讲解(哈?都不知道?报告老师,这里有一只假喵中的假喵!)。

由于文章过长(也就是说小夕的讲解过于认真\(//∇//)\),小夕将文章拆为三部分。万一读到停不下来,听说交出小红包,小夕就会出现哦( ̄∇ ̄)

递增式扩容

对于Java的LinkedList,也就是数据结构中的链表,其空间增长方式就是小夕一开始的设想:每增加一个元素,其大小就增加一个单位(这里的一个单位就是指一个元素占用的空间大小)。原因就在于链表在内存中的存储可以是不连续的。例如一个依次由节点1、节点2、节点3连接而成的链表在计算机内存中完全有可能是下面的存储方式。

这样的话,链表每增加一个元素,只需要在内存中找个缝将新元素插进去就好啦~所以如果小夕手里有n个元素想插入链表,则需要开辟n次内存,每次均开辟一个元素的大小。这种数据结构建立后,每次数据结构要扩容时均增加固定空间大小的做法被称为【递增式扩容】。显然链表的空间增长方式就是递增式扩容,而且递增的单位为1(这里是指1个单位,即一个结点的大小)。

可以看到,如果是链表数据结构,或者是底层基于链表而实现的数据结构,采用递增式扩容是最优选择。因为要增加一个元素,则最好的情况就是其他什么都不动,仅仅是为该元素开辟一个单位的空间,然后塞入该元素。而递增式扩容用于链表确实达到了这个最理想情况呢。因此,对于链表,以及底层基于链表结构实现的数据结构,都是采用递增式扩容即可达到最优扩容效率(最优动态空间增长)。例如哈希中的横向增长,再如基于链表实现的树(如Java中的TreeSet,TreeMap等)。因此在操纵大量数据的时候,尤其机器学习任务中常见的操纵大量样本的时候,在内存的问题上可以安心的使用此类数据结构,不会导致“内存爆炸”的问题,内存只会慢慢的起火然后轻轻的告诉你满了,23333。当然了,不能仅考虑内存,有时操纵大量数据时对数据处理效率要求更高,这时候就要舍内存保速度啦。

那么哪些常见数据结构采用递增式扩容无法达到最优呢?还有,小夕遇到的内存爆炸是怎么回事呢?敬请期待小夕明天的大作啦!

如果觉得小夕的讲解帮到了或者萌到了您,记得用小红包鼓励小夕哦~小夕都要买不起返校车票了嘤嘤嘤...

小夕已委托维权骑士对小夕发布文章的版权行为进行追究与维权。如需转载,请联系微信xiyaomengmengda。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。