日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2024/7/5 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【萌味】小夕说,不了解动态空间增长的程序喵都是假喵(上) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

小提示:小夕會(huì)將小屋的最新動(dòng)態(tài)更新到小屋的布告欄哦,口令是【nb】(口令在訂閱號(hào)主界面直接回復(fù)即可使用)。 ? ? ? ? ?

小夕學(xué)了數(shù)據(jù)結(jié)構(gòu)后,知道了鏈表、樹(shù)、哈希表等數(shù)據(jù)結(jié)構(gòu)與靜態(tài)數(shù)組的固定容量不同,它們是可以動(dòng)態(tài)添加元素的。這種數(shù)據(jù)結(jié)構(gòu)的初始大小可能很小,甚至幾乎為零,但是隨著新元素的加入,其大小(內(nèi)存空間占用)會(huì)不斷增長(zhǎng),這個(gè)過(guò)程就叫做動(dòng)態(tài)空間增長(zhǎng)。那么問(wèn)題來(lái)了,所有支持動(dòng)態(tài)空間增長(zhǎng)的數(shù)據(jù)結(jié)構(gòu)都是相同的增長(zhǎng)方式嗎?了解這個(gè)又有什么意義呢?

前言

小夕曾經(jīng)很傻很天真的認(rèn)為所有支持動(dòng)態(tài)空間增長(zhǎng)的數(shù)據(jù)結(jié)構(gòu)都是每增加一個(gè)元素,數(shù)據(jù)結(jié)構(gòu)的大小就增加1個(gè)單位。直到在一個(gè)中規(guī)模機(jī)器學(xué)習(xí)任務(wù)的數(shù)據(jù)預(yù)處理過(guò)程中遇到了“內(nèi)存爆炸”的問(wèn)題,即小夕明明計(jì)算的內(nèi)存夠用,但是小夕可憐的電腦的內(nèi)存卻意外爆滿了。最終小夕在某大神的指導(dǎo)下才知道原來(lái)數(shù)據(jù)結(jié)構(gòu)的容量還能是加倍加倍的擴(kuò)!小夕瞬間感到自己的智商可能只剩23.333了。

作為程序喵,不能光講大道理。小夕為了避免講解太過(guò)抽象,如果您是C++程序喵,那么請(qǐng)注意一下Vector數(shù)據(jù)結(jié)構(gòu);如果是Java程序喵,請(qǐng)注意一下ArrayList、LinkedList、哈希系列(HashSet/HashTable/HashMap);如果是不用Java也不用C++的程序喵,或者是已經(jīng)脫離XX編程語(yǔ)言層次的程序喵,那么請(qǐng)注意一下可變數(shù)組(可增長(zhǎng)順序表)、鏈表、哈希(散列)。小夕將基于上面這些程序喵肯定知道的東西來(lái)花式講解(哈?都不知道?報(bào)告老師,這里有一只假喵中的假喵!)。

由于文章過(guò)長(zhǎng)(也就是說(shuō)小夕的講解過(guò)于認(rèn)真\(//?//)\),小夕將文章拆為三部分。萬(wàn)一讀到停不下來(lái),聽(tīng)說(shuō)交出小紅包,小夕就會(huì)出現(xiàn)哦( ̄? ̄)

遞增式擴(kuò)容

對(duì)于Java的LinkedList,也就是數(shù)據(jù)結(jié)構(gòu)中的鏈表,其空間增長(zhǎng)方式就是小夕一開(kāi)始的設(shè)想:每增加一個(gè)元素,其大小就增加一個(gè)單位(這里的一個(gè)單位就是指一個(gè)元素占用的空間大小)。原因就在于鏈表在內(nèi)存中的存儲(chǔ)可以是不連續(xù)的。例如一個(gè)依次由節(jié)點(diǎn)1、節(jié)點(diǎn)2、節(jié)點(diǎn)3連接而成的鏈表在計(jì)算機(jī)內(nèi)存中完全有可能是下面的存儲(chǔ)方式。

這樣的話,鏈表每增加一個(gè)元素,只需要在內(nèi)存中找個(gè)縫將新元素插進(jìn)去就好啦~所以如果小夕手里有n個(gè)元素想插入鏈表,則需要開(kāi)辟n次內(nèi)存,每次均開(kāi)辟一個(gè)元素的大小。這種數(shù)據(jù)結(jié)構(gòu)建立后,每次數(shù)據(jù)結(jié)構(gòu)要擴(kuò)容時(shí)均增加固定空間大小的做法被稱為【遞增式擴(kuò)容】。顯然鏈表的空間增長(zhǎng)方式就是遞增式擴(kuò)容,而且遞增的單位為1(這里是指1個(gè)單位,即一個(gè)結(jié)點(diǎn)的大小)。

可以看到,如果是鏈表數(shù)據(jù)結(jié)構(gòu),或者是底層基于鏈表而實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu),采用遞增式擴(kuò)容是最優(yōu)選擇。因?yàn)橐黾右粋€(gè)元素,則最好的情況就是其他什么都不動(dòng),僅僅是為該元素開(kāi)辟一個(gè)單位的空間,然后塞入該元素。而遞增式擴(kuò)容用于鏈表確實(shí)達(dá)到了這個(gè)最理想情況呢。因此,對(duì)于鏈表,以及底層基于鏈表結(jié)構(gòu)實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu),都是采用遞增式擴(kuò)容即可達(dá)到最優(yōu)擴(kuò)容效率(最優(yōu)動(dòng)態(tài)空間增長(zhǎng))。例如哈希中的橫向增長(zhǎng),再如基于鏈表實(shí)現(xiàn)的樹(shù)(如Java中的TreeSet,TreeMap等)。因此在操縱大量數(shù)據(jù)的時(shí)候,尤其機(jī)器學(xué)習(xí)任務(wù)中常見(jiàn)的操縱大量樣本的時(shí)候,在內(nèi)存的問(wèn)題上可以安心的使用此類數(shù)據(jù)結(jié)構(gòu),不會(huì)導(dǎo)致“內(nèi)存爆炸”的問(wèn)題,內(nèi)存只會(huì)慢慢的起火然后輕輕的告訴你滿了,23333。當(dāng)然了,不能僅考慮內(nèi)存,有時(shí)操縱大量數(shù)據(jù)時(shí)對(duì)數(shù)據(jù)處理效率要求更高,這時(shí)候就要舍內(nèi)存保速度啦。

?

那么哪些常見(jiàn)數(shù)據(jù)結(jié)構(gòu)采用遞增式擴(kuò)容無(wú)法達(dá)到最優(yōu)呢?還有,小夕遇到的內(nèi)存爆炸是怎么回事呢?敬請(qǐng)期待小夕明天的大作啦!

如果覺(jué)得小夕的講解幫到了或者萌到了您,記得用小紅包鼓勵(lì)小夕哦~小夕都要買(mǎi)不起返校車(chē)票了嚶嚶嚶...

小夕已委托維權(quán)騎士對(duì)小夕發(fā)布文章的版權(quán)行為進(jìn)行追究與維權(quán)。如需轉(zhuǎn)載,請(qǐng)聯(lián)系微信xiyaomengmengda。

總結(jié)

以上是生活随笔為你收集整理的【萌味】小夕说,不了解动态空间增长的程序喵都是假喵(上)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。