數(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)。
當(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)。
鏈表
鏈表的內(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)存插入鏈表中。
在鏈表中查找第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ì)列,在兩端都可以插入和刪除
棧
這個(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ù)。
歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)標(biāo)明出處