性能優(yōu)化-數(shù)組和鏈表,隊(duì)列和棧

數(shù)組

數(shù)組的內(nèi)存是連續(xù)的,不同的語言有著不同的分配內(nèi)存規(guī)則。有的需要開始的時(shí)候指定長度,有的不需要(當(dāng)數(shù)組的長度不夠的時(shí)候會(huì)分配一個(gè)新的更長的內(nèi)存,然后把原來的數(shù)據(jù)復(fù)制過來,這個(gè)操作很費(fèi)時(shí)),訪問數(shù)組中第n個(gè)數(shù)據(jù)的時(shí)間花費(fèi)是O(1),但是要在數(shù)組中查找一個(gè)指定的數(shù)據(jù)則是O(N)。

數(shù)組內(nèi)存示意圖

當(dāng)向數(shù)組中插入或者刪除數(shù)據(jù)的時(shí)候,最好的情況是在數(shù)組的末尾進(jìn)行操作,時(shí)間復(fù)雜度是O(1),但是最壞情況是插入或者刪除第一個(gè)數(shù)據(jù),時(shí)間復(fù)雜度是O(N)。在數(shù)組的任意位置插入或者刪除數(shù)據(jù)的時(shí)候,后面的數(shù)據(jù)全部需要移動(dòng),移動(dòng)的數(shù)據(jù)還是和數(shù)據(jù)個(gè)數(shù)有關(guān)所以總體的時(shí)間復(fù)雜度仍然是O(N)。

數(shù)組插入刪除示意圖

鏈表

鏈表的內(nèi)存不是連續(xù)的。通過指針將各個(gè)內(nèi)存單元鏈接在一起,不是環(huán)形的鏈表會(huì)有一個(gè)或者二個(gè)節(jié)點(diǎn)的指針指向NULL(單項(xiàng)一個(gè),雙向兩個(gè))。鏈表不需要提前指定長度,也不會(huì)出現(xiàn)長度不夠的問題,當(dāng)需要存儲(chǔ)數(shù)據(jù)的時(shí)候分配一塊內(nèi)存并將這塊內(nèi)存插入鏈表中。


單向鏈表示意圖
雙向鏈表示意圖


環(huán)形的鏈表

在鏈表中查找第n個(gè)數(shù)據(jù)以及查找指定的數(shù)據(jù)的時(shí)間復(fù)雜度是O(N),但是插入和刪除數(shù)據(jù)的時(shí)間復(fù)雜度是O(1),因?yàn)橹恍枰{(diào)整指針就可以(插入的時(shí)候你需要知道插入的數(shù)據(jù)的前一個(gè)數(shù)據(jù)或者后一個(gè)數(shù)據(jù),所以雙向的更靈活,但是單向和雙向都不能向一個(gè)方向遍歷出所有的數(shù)據(jù),所以環(huán)形鏈表誕生了)


鏈表刪除


鏈表插入

隊(duì)列

這個(gè)數(shù)據(jù)結(jié)構(gòu)是先進(jìn)先出的,就像排隊(duì)買東西一樣,先來的先買,數(shù)組或者是鏈表都能實(shí)現(xiàn)它,隊(duì)列只允許在隊(duì)尾添加數(shù)據(jù),在隊(duì)頭刪除數(shù)據(jù)。但是可以查看隊(duì)頭和隊(duì)尾的數(shù)據(jù)。還有一種是雙端隊(duì)列,在兩端都可以插入和刪除


雙端隊(duì)列


隊(duì)列


這個(gè)數(shù)據(jù)結(jié)構(gòu)是先進(jìn)后出的,先放進(jìn)去的數(shù)據(jù)會(huì)被后放進(jìn)去的數(shù)據(jù)壓到下面,數(shù)組或者是鏈表都能實(shí)現(xiàn)它,棧中的數(shù)據(jù)的所有操作都是在棧的頂部完成的,只可以查看棧頂部的數(shù)據(jù),只能夠向棧的頂部壓入數(shù)據(jù),也只能從棧的頂部彈出數(shù)據(jù)。


點(diǎn)擊這里可以看到作者的其他文章

歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)標(biāo)明出處

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容