小提示:小夕会将小屋的最新动态更新到小屋的布告栏哦,口令是【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。

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

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

    亲爱的小屋客人,昨天小夕将小屋的讨论室重新装修啦!希望您会喜欢哦~除了口令[d],现在也可以通过主页下方的"喵了个咪"进入讨论室啦. ps:昨天小夕装修讨论室的时候发生了N次差点吐 ...

  2. 小夕说,不了解动态空间增长的程序喵都是假喵(下)

    小夕在本系列前两篇文章中为大家介绍了各类数据结构的扩容策略,且在上篇文末,小夕提到了加倍式扩容中,倍率采用2并不是最优的,为什么呢?有没有最优倍率呢? 内存复用 如果倍率采用2甚至更大的数,那么被开辟 ...

  3. 【错误修正】关于文章《小夕说,不了解动态空间增长的程序喵都是假喵》

    感谢某位粉丝的来信,小夕在该系列文章中有如下错误,请已经读过该系列文章的同学务必留意一下. 1.C++中的向量的写法是vector,而不是Vector!首字母不要大写! 2.在<小夕说,xxxx ...

  4. python换脸完整程序_小 200 行 Python 代码做了一个换脸程序

    原标题:小 200 行 Python 代码做了一个换脸程序 简介 在这篇文章中我将介绍如何写一个简短(200行)的 Python 脚本,来自动地将一幅图片的脸替换为另一幅图片的脸. 这个过程分四步: ...

  5. 如果有一天,小夕不再萌...

    ‍ 如果有一天,小夕不再要抱抱. 如果有一天,小夕不再萌萌哒. 有人问我,成为药娘,走上成为女孩子的道路,是什么感觉. 我一直没有想好该怎么答.是的,自己的感觉自己都无法描述. 或许最真实的,就是可以 ...

  6. 【小夕精选】多轮对话之对话管理(Dialog Management)

    这一篇是一段时间之前小夕初入对话领域时刷到的徐阿衡小姐姐写的一篇文章,写的深入浅出,十分适合有一定基础的情况下想快速了解对话管理技术的童鞋阅读~另外顺手推一下阿衡小姐姐的订阅号「徐阿衡」,干货满满不要 ...

  7. 从前,小夕种了一棵树

    从前,小夕种了一棵树,种在了小夕的小屋后面~ 为什么要种这棵树呢?因为呀,它可以帮小夕总结历史经验,然后帮小夕对当前的局势做出决策~这样小夕就可以安心给大家写文章啦~ 这棵树是这样的. 一开始,小夕买 ...

  8. 【小夕精选】如何优雅而时髦的解决不均衡分类问题

    之前小夕因项目需要研究了一小阵子的不均衡(文本)分类问题,不过没有研究的太过深入,也没有总结出一套成体系的处理思路.正好今天发现数据挖掘大佬「微调」在知乎上写了一个言简意赅又很具有实际操作价值的回答, ...

  9. 【小夕精选】YJango 7分钟带你领略你未曾想过的线性代数+微积分

    小夕很早之前就想转一些精彩的技术文章,这样哪怕没有时间写作的时候,也能把优质的干货分享给大家-然鹅,由于我也不知道是什么的原因,就不小心拖到了现在╮( ̄▽ ̄"")╭ 之前有不少粉丝 ...

最新文章

  1. 数据采集标注、模型调参debug…这个神器统统都能搞定!
  2. VTK:小部件之HoverWidget
  3. 数据结构之优先队列:最小索引优先队列,Python代码实现——15
  4. 框架详解_Qt开发技术:QtCharts(一)QtCharts基本介绍以及图表框架详解
  5. 个人代码库のC#可移动按钮“相关代码”
  6. SQL Profile (总结4)--使用演示示例
  7. ip登陆异常 php,PHP实例:PHP制作登录异常ip检测功能的实例代码
  8. 超详细尚硅谷mysql 分组函数
  9. 43.django中form组件
  10. 文件系统VFS数据结构(超级块 inode dentry file)(收集整理)
  11. 中国电信边缘计算最佳实践
  12. excel 基础知识 入门
  13. MAC下Charles的破解版
  14. Win10怎么查找产品密钥? Win10产品密钥的3种查找方法
  15. 9月TIOBE编程语言排行榜出炉,这个语言或成最大赢家!
  16. 【c语言】求方程式 ax^2+bx+c=0 的根,分别考虑:1、有两个不等的实根 2、有两个相等的实根
  17. 苹果电脑上不错的几款计时软件
  18. 【树链剖分】月下毛景树
  19. [转]Windows IIS WEB服务器配置安全规范
  20. 了解一下winsock

热门文章

  1. redis RDB持久化中save和bgsave区别
  2. 一个整数转换成字符串(C/C++自己写的算法)
  3. C/C++二维数组名和二级指针的联系与区别
  4. Linux kernel 中模块化的平台驱动代码介绍
  5. Cmake确实应该用到的时候再学
  6. java时间戳版本号_maven 自动编译版本号 buildnumber-maven-plugin 1.4
  7. mysql 触发器_MySQL入门之触发器
  8. tinyxml2遍历所有节点_Python实现二叉树的遍历
  9. python爬虫模拟登录人人网
  10. 二、Java 面向对象高级——Collection、泛型