從全局視角看數據結構
電腦的本質就是為了處理數據,數據運算的時候是放在記憶體中的,由於電腦的特性,儲存只有兩種方式:
- 順序結構:存儲在連續的記憶體上。
- 鏈式結構:存儲在不連續的記憶體上。
物理結構
順序結構
順序結構的原始模型就是數組,由於存放的都是同一種數據,比如int,每個數據佔用的記憶體單元是一致的,那麼當我們知道首地址之後就可以推導出任意位置的地址(等差數列)。這就是隨機訪問。
- 順序結構的優勢在於隨機訪問很快。
但是由於需要連續記憶體,當我們插入、刪除一個元素的時候,就要移動後面的元素。
- 順序結構的劣勢就在於插入刪除比較慢。
鏈式結構
鏈式結構的原始模型是鏈表,我們增加一個指針記錄下一個元素的地址,這樣就不用放在連續的記憶體上,當我們插入刪除的時候,只需要處理前後元素即可。
- 鏈式結構的優勢在於新增、刪除很快。
但是由於不連續,我們無法用公式推導出第N個元素的位置,隨機訪問只能通過遍歷。
- 鏈式結構的劣勢在於隨機訪問很慢。
小結
由於電腦設計的限制,我們只有兩種物理結構去存儲數據,如果有一天我們的電腦模型變化了,一切都會跟著變。
邏輯結構
怎麼放記憶體是一回事,怎麼處理他們又是一回事,怎麼處理就叫邏輯結構。
比如:
- 棧:先進先出。
- 隊列:後進先出。
- 樹:將鏈表從一維拉到了二維,是一對多。
- 圖:也是拉到了二維,是多對多。
邏輯結構都可以用兩種物理結構去實現,只是有優劣之分。
為了解決物理結構的劣勢,人們也發明了很多演算法去優化數據結構。
數據結構是為演算法服務的,演算法要作用在特定的數據結構之上。
比如,為了解決鏈表的遍歷慢,發明了跳躍表、二叉樹等。為了解決數組的插入快慢問題,發明了散列表+拉鏈法。
總之,都是充分利用數組的隨機訪問快,鏈表的插入、刪除快。