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