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

亲爱的小屋客人,昨天小夕将小屋的讨论室重新装修啦!希望您会喜欢哦~除了口令[d],现在也可以通过主页下方的“喵了个咪”进入讨论室啦。

ps:昨天小夕装修讨论室的时候发生了N次差点吐血的事件,明天小夕与大家含泪分享T_T。

在上一篇文章中,小夕为大家讲解了链表与递增式扩容的姿势,而这一篇,将会是本系列文章的高潮哦(不!要!污!)

源于数组

上篇文章中,小夕为了避免大家理解起来抽象,让大家注意了几个数据结构:

如果您是C++程序喵,那么请注意一下Vector数据结构;如果是Java程序喵,请注意一下ArrayList、LinkedList、哈希系列(HashSet/ HashTable/ HashMap);如果是不用Java也不用C++的程序喵,或者是已经脱离XX编程语言层次的程序喵,那么请注意一下可变数组(可增长顺序表)、链表、哈希(散列)。

上篇文章中小夕讲解了基于链表实现的数据结构都是递增式扩容最优。那么对于C++中的Vector,Java中的ArrayList、HashSet/ HashTable/ HashMap,也就是数据结构中的可变数组、哈希来说,空间增长方式是怎样呢?可能有可爱的读者宝宝此时在想“天呐,这些数据结构又特喵的不一样,怎么放到一起讨论了呢?”好啦,让小夕碾压这些读者宝宝吧(小夕再次跑路)!其实这些表面看似不同的东西,底层的实现方式确是一样的,它们在底层都是通过操纵静态数组来实现他们的动态空间增长功能,下文会详细介绍哦。

讲到这里,可能爱思考的读者宝宝会记得小夕在上一篇中也提到过哈希,说哈希的横向增长是基于链表的,因此递增式扩容是最优动态空间增长方案。那这一篇中又说哈希是基于静态数组的,这是怎么回事呢?下面给没有接触过哈希的读者宝宝先科普一下哈希:

哈希的横向增长是基于链表实现的,即当新元素的哈希值与已有元素哈希值相同时,新元素会插入到某个链表中,因此是递增式增长。但是更多的情况下,哈希是纵向增长的。学过数据结构的宝宝知道,哈希在纵向上就是一个指针数组,数组的每个索引值即代表一个哈希值,数组的每个元素是一个指向某链表的指针。画个图来看就是这样的。

所以,在本篇文章中,我们不看哈希的横向增长啦,就看竖着的,也就是纵向增长,此时显然是基于静态数组实现的哦。

下面小夕直接以“数据结构”代称所有这些基于静态数组实现的动态空间分配的数据结构,包括但不限于C++中的Vector(即数据结构中的动态数组),Java中的ArrayList(即动态数组)、Hash系列(即哈希/散列)等~

具体来说,如何用静态数组实现上述的动态空间增长的数据结构呢?其实很简单,每次数据结构要扩容时只需要依次进行下述操作就完成啦:

  1. 开辟一段新的内存空间,空间大小就是扩容后的数据结构大小。

  2. 把旧数据结构,也就是旧的内存空间的元素一个个的复制到新的内存空间

  3. 释放旧的内存空间(代码上就是删除旧空间的指针,当然像Java这种自动管理内存的语言就不用程序喵操心这一步了)

通过上述扩容的三步操作,可以看到每次哈希表的扩容操作的代价还是挺大的。第1步和第3步的代价不算大,但是第2步的代价会随着要搬移元素数量的增加而直线上升。所以这就相当于一个完整搬家的过程:先买个新房子,再把旧房子里的全部家当搬到新房子里去,再把旧房子注销,你说麻不麻烦喵= ̄ω ̄=

加倍式扩容

既然代价如此之大,那么显然我们要尽量减小扩容次数呀~每次扩容都是大出血...怎么扩呢?一个很creative的想法就是每次使数据结构变为自身的两倍!再机智一点,每次使数据结构变为自身的N倍!其中N只要大于1就可以!这种每次使自身的大小变为之前N倍的数据结构动态空间增长方式称为【加倍式扩容】。实际上,基于静态数组的数据结构的动态空间增长问题上加倍式扩容远远优于递增式扩容口说无凭,待小夕用萌味算法分析来证明!

假如数据结构A使用【递增式扩容】。每次数据结构满了的时候就固定的增加10个单位的空间(增加单位的数量不会影响最终分析出来的复杂度哦)。好,那小夕现在手里有n个元素想添加进数据结构,假如n的数值很大,远远的大于10,那么要执行多少次扩容操作呢?当然是n/10次啦~这n/10次扩容的累计开销大约为cost=10+2*10+3*10+…+(n/10)*10,计算一下这个级数,就是cost=[(n/10)/2]*[(n/10)+1]*10,所以复杂度是O(n2)的数量级,所以平均每个元素被添加进哈希表时的开销为cost/n,也就是O(n)的复杂度。

 

假如数据结构B使用【加倍式扩容】。每次数据结构满了的时候,数据结构的大小就变成原来的2倍(与之前同样的,这个倍数取不同的值并不会影响最终分析出来的复杂度哦~当然倍数必须大于1!)。同样,小夕将n个元素添加进数据结构,假如n的数值很大,远远的大于2,那么要执行的扩容操作的次数是…小夕去算一会...嗯…应该是log2n!令c=log2n,则这c次扩容操作的累计开销为cost=21+22+…+2c。这个级数的和为cost=[2/(1-2)]*(1-2c),代入c=log2n得cost=2(n-1)。也就是说复杂度为O(n),所以平均每个元素被添加进哈希表时的开销为cost/n,也就是O(1)的复杂度!注意前面我们计算过,这里数据结构A(递增式扩容)的复杂度为O(n)!

怎么样~小夕说的没错吧,读者宝宝有没有拨开云彩见到日呢( ̄∇ ̄)。所以说呀,正是因为这类数据结构采用了加倍式扩容,导致这类数据结构申请内存的时候翻倍翻倍的要。结果当时在那个机器学习任务中,小夕算的是一个超大哈希表只需要占用5个G作右的内存空间,而实际上在往这个哈希表加数据时,从4个G直接爆到了接近8个G,导致小夕内存8G的小电脑直接崩盘了~

等等,看似此文可以结了,实际上,敏锐的读者宝宝可能想到了,“递增式扩容你都告诉我了每次扩容增加一个单位的空间就最优了,那加倍式扩容每次增大几倍最优呢?”如果读者宝宝能发现这一点的话,真的非常棒啦!答案是2倍吗?当然不!那是几呢?下篇萌货(萌味干货的简称)见分晓( ̄∇ ̄)。

啊啊,高潮果然是最累的(我说文章的高潮啊喂~),小夕好累喵(´Д` )。所以亲爱的读者宝宝是不是有一种抑制不住要鼓励小夕的冲动吖(⁎⁍̴̛ᴗ⁍̴̛⁎)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/481324.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

马斯克点赞!DeepMind神AI编剧,一句话生成几万字剧本

来源:机器学习研究组订阅你有灵光乍现的时刻吗?就是那种:这点子太好了,要是拍成电影一定能大火?之前这种想法可能只能停留在你的脑海中,而现在,一个「AI编剧大师」的出现,或许能让你…

“东数西算”之五大热点问题探讨

"“东数西算”无疑是2022年一大热词,产业界和学术界就该话题进行了深入的研究探讨。"整体上来看,“东数西算”的实施,一方面是为了更好地利用西部相对优惠的电力资源和优异的气候条件,推动数据中心的优化布局和产业整体…

科普一下人工智能领域的研究方向

路人甲:“你是学什么的?” 小夕:“学计算机嗒~” 路人甲:“哦哦,那你ps肯定很厉害!” 小夕:“我不会,我是做人工智能的。” 路人甲:“哦哦,做机器人的啊&…

编程神器Copilot被官司搞怕了?月收费19美元的商业版将提供辩护服务,最高索赔50万美元...

来源:AI前线作者:凌敏、核子可乐Copilot 的商业化“虽迟但到”。GitHub 推出商业版 Copilot据外媒 theRegister 报道,GitHub 旗下的 AI 编程神器 Copilot 现已推出商业版本,每月收费 19 美元(约合 133 元人民币&#x…

【激萌】人工智能大地图-生存能力篇

小屋的喵喵们,讨论室的投票明天就要截止了,还没有投票的喵喵快来啦。通过口令[d]或者主界面下方“喵了个咪”菜单即可进入讨论室哦。本文的封面图还是小夕设计的哦~喜欢吗(⁎⁍̴̛ᴗ⁍̴̛⁎)路人甲:“你是学什么的?”小夕&#…

Nature经典回顾:大脑中统一的物体空间模型

导语大脑能够轻而易举的完成物体识别,这一过程主要在大脑的下颞叶皮层进行。研究已经发现下颞叶皮层存在面孔、身体、场景等类别选择性区域,然而,仍有大部分下颞叶皮层未发现已知的功能特异性。这就带来一系列问题:未被理解的大片…

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

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

ChatGPT 与AI大模型发展简要综述

来源:数据观综合编辑:蒲蒲"日前,美国硅谷的初创公司OpenAI推出了一款新的人工智能对话模型ChatGPT,模型中首次采用RLHF(从人类反馈中强化学习)方式。目前,模型处于测试阶段,用户…

Nature Reviews Physics:人工智能怎样促进科学理解

导语一个能正确预测每个粒子物理实验结果、每个可能的化学反应产物或每个蛋白质的功能的先知将彻底改变科学和技术。然而,科学家们不会完全满意,因为他们想了解先知是如何做出这些预测的。这就是科学理解(scientific understanding&#xff0…

史上最萌最认真的机器学习/深度学习/模式识别入门指导手册(一)

喵喵喵~大家元宵节快乐噢。有没有要陪小夕出去看烟花的吖...小夕借此给热爱学习的喵喵们献上这篇拙文,希望不要嫌弃哦~还有,小夕画的封面图是不是很棒呀( ̄∇ ̄)小夕发现现在想进军人工智能领域的程序yuan甚至少年少女喵好多呀&…

OpenAI ChatGPT走红,DeepMind不甘示弱,推出剧本写作AI,一句话生成一个剧本

来源:机器学习研究组订阅Dramatron似乎在一定程度上克服了AI大模型写长剧本前后不连贯的问题。你是否有过这种体验:某一天逛街的时候,脑子里突然冒出来一个好玩的故事,但你一时想不到更多的细节,也没有一块完整的时间去…

[完结]以C++与Java为例,详解数据结构的动态增长策略

前言 本文改编自小夕的订阅号文章《【萌味】小夕说,不了解动态空间增长的程序喵都是假喵(上)》、《【萌味】小夕说,不了解动态空间增长的程序喵都是假喵(中)》、《【萌味】小夕说,不了解动态空间增长的程序喵都是假喵(…

量子计算机创造了虫洞吗?不完全是,但揭示了量子模拟的未来

来源:光子盒研究院最近,科学家们因据称产生了一个虫洞而成为头条新闻。发表在《自然》杂志上的这项研究使用量子计算机在简化的物理模型中模拟虫洞。消息传出后不久,物理学家和量子计算专家对虫洞是否真的存在表示怀疑。这是怎么回事&#xf…

复旦大学邱锡鹏教授:语言模型即服务,走向大模型的未来

来源:智源社区作者:智源社区整理:周致毅人类一直期待AI能在处理自然语言方面大放异彩,语言大模型在近些年已逐渐成为NLP领域的标配。随着模型的扩张,当前大模型的调用已变成上游厂商开放API供下游使用的模式。这一模式…

史上最萌最认真的机器学习/深度学习/模式识别入门指导手册(二)

谢谢你们。小夕昨晚又熬夜被发现了,谢谢对小夕的关心...有你们陪着,小夕很幸运。路人乙:“小夕,别人都说上完coursera上的那门机器学习课就已经入门机器学习了,可你又不这样认为。那你认为上完那门课,或者说…

计算机史上首篇教你从算法问题提炼算法思想的文章

路人丙:“小夕,你说学算法有什么用呢?”小夕:“好玩呀。”路人丙:“算法问题那么多,现查现用不就好了?”小夕:“好咯,既然你诚心诚意的问了~小夕就大发慈悲的震惊你(&…

美国能源部正式宣布核聚变里程碑式突破,专家点评商业化还需数10年

来源:澎拜责任编辑:郑洁图片编辑:张同泽校对:施鋆耗资35亿美元的美国国家点火装置用了10多年时间不断冲击点火目标,过程一波三折。成功点火后有两条路可走。一是冲刺更高的能量增益,未来或将再建更大能量的…

Science:找到杀死癌细胞的“单词”

来源:生物通利用新的机器学习技术,加州大学旧金山分校(UCSF)的研究人员与IBM研究院的一个团队合作,开发了一个包含数千个细胞“命令句”的虚拟分子库,基于引导工程免疫细胞寻找并不知疲倦地杀死癌细胞的“单词”组合。预测模型允许…

拼写校正与动态规划的小故事

喵喵喵,细心的你有没有发现小夕已经将卧室和书房精装修了呢~可以输入口令【ho】,或者点击主页的“旧的故事”标签进入哦。一个小现象小夕今天给大家讲一个自然语言处理/信息检索领域的小现象~细心的同学可能发现啦,每当你在使用某度进行搜索时…

《物理世界》公布2022年度十大突破

来源:科技日报近日,英国《物理世界》杂志公布了2022年度十大突破,涵盖从量子、医学物理学、天文学到凝聚态物质等各个方面。这十项突破是由《物理世界》编辑小组从今年在该杂志网站上发布的涵盖物理学所有领域的数百项研究中精选出来的。开创…