數(shù)據(jù)結(jié)構(gòu)與算法學(xué)習(xí)(2)
數(shù)據(jù)結(jié)構(gòu)=線性(基本數(shù)據(jù)結(jié)構(gòu)+邏輯數(shù)據(jù)結(jié)構(gòu))+非線性(二維數(shù)組, 多維數(shù)組, 廣義表, 樹結(jié)構(gòu), 圖結(jié)構(gòu))
本篇主要總結(jié)線性數(shù)據(jù)結(jié)構(gòu)
基本數(shù)據(jù)結(jié)構(gòu):順序存儲(chǔ)結(jié)構(gòu)(數(shù)組)、鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)(鏈表)
數(shù)組:由有限個(gè)相同類型的變量所組成的有序集合
特點(diǎn):查詢快,增刪慢
長度固定,不會(huì)自動(dòng)擴(kuò)容
數(shù)組的擴(kuò)容其實(shí)是對(duì)數(shù)組的復(fù)制
鏈表:由若干節(jié)點(diǎn)組成, 每個(gè)節(jié)點(diǎn)包含指向下一節(jié)點(diǎn)的指針
特點(diǎn):查詢慢,增刪快
鏈表的第一個(gè)節(jié)點(diǎn)為頭節(jié)點(diǎn),最后一個(gè)節(jié)點(diǎn)是尾節(jié)點(diǎn)。
每一個(gè)節(jié)點(diǎn)由兩部分組成,分別為存放數(shù)據(jù)的內(nèi)存和指向下一個(gè)節(jié)點(diǎn)的指針。
尾節(jié)點(diǎn)指針為null。
查詢資料看到的圖解,感覺便于理解。
單鏈表圖解

雙向鏈表圖解

數(shù)組,鏈表增刪改查的時(shí)間復(fù)雜度對(duì)比

邏輯數(shù)據(jù)結(jié)構(gòu):棧、隊(duì)列、散列表(hash表)(邏輯數(shù)據(jù)結(jié)構(gòu)都可以由基本數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn))
棧: 棧將允許進(jìn)行插入、刪除的一端稱為棧頂,另一端稱為棧底。
特點(diǎn):先進(jìn)后出
既可以由數(shù)組實(shí)現(xiàn),也可以由鏈表實(shí)現(xiàn)
操作:入棧、出棧

隊(duì)列:隊(duì)列(Queue)是一種先進(jìn)先出的抽象的數(shù)據(jù)結(jié)構(gòu)。對(duì)應(yīng)我們?nèi)粘I钪谐R姷氖桥抨?duì)買票、排查吃飯等。
特點(diǎn):先進(jìn)先出
既可以由數(shù)組實(shí)現(xiàn),也可以由鏈表實(shí)現(xiàn)
操作:入隊(duì)、出隊(duì)

散列表:hash表(key-value)的數(shù)據(jù)關(guān)系【哈希函數(shù)中,哈希值涉及位運(yùn)算優(yōu)化性能,優(yōu)于取模計(jì)算】
操作:讀、寫
散列表在寫操作時(shí),會(huì)產(chǎn)生哈希沖突
解決方法:開放尋址法(threadlocal此處不做過多總結(jié))、鏈表法(hashmap底層【Java7、8有不同的底層優(yōu)化,7采用數(shù)組+鏈表,8采用數(shù)組+鏈表+紅黑樹】此處不做過多總結(jié))
哈希表擴(kuò)容:1、數(shù)組擴(kuò)容 2、重新hash
擁擠的哈希表擴(kuò)容后變得稀疏

浙公網(wǎng)安備 33010602011771號(hào)