演算法與資料結構-陣列/連結串列/堆/棧/佇列的儲存
序言
之前華為來交大宣講的時候,曾參加了一次現場交流,當時面試官給我出了一個三維資料儲存的問題,然後變著法的問如果要進行資料的怎樣怎樣變動需要使用什麼方式來儲存,由於當時對各種資料結構的儲存方式和特點掌握得不好沒能很順暢的回答,在這對各種資料結構的儲存方式做個簡單總結。
幾個概念
資料結構:描述物件間邏輯關係的學科
資料儲存:資料在計算機中的儲存方式
資料儲存的分類:
順序儲存: 物理連續。把資料儲存在一塊連續的儲存介質上,陣列即典型的順序儲存
非順序儲存:邏輯連續。各個資料不一定存在連續的位置上,只要能連起來就行了,連結串列就是典型的非順序儲存
1. 陣列
順序儲存
陣列使用一塊連續的記憶體空間中儲存資料
陣列是最基本的資料結構,儲存資料的個數和空間從一開始就是確定的
陣列操作的時間複雜度:
訪問第n個數據的時間複雜度為O(1)
查詢指定資料的時間複雜度是O(N)
陣列中插入或刪除資料的時間複雜度[與資料個數N有關]
最好情況是O(1)
最壞情況是O(N)
2. 連結串列
非順序儲存
連結串列是在非連續的記憶體單元中儲存資料
- 可以是連續的也可以是不連續的,一般來說是不連續的
連結串列儲存資料的個數和空間均不需要提前指定,當需要儲存資料時分配一塊記憶體並將這塊記憶體插入連結串列中
連結串列中總有一個節點指向NULL
連結串列操作的時間複雜度
訪問第n個數據的時間複雜度是O(N)
查詢指定資料的時間複雜度是O(N)
插入和刪除資料的時間複雜度是O(1)
- 只需調整指標即可
連結串列常見分類:
單向連結串列
雙向連結串列
迴圈連結串列(迴圈單鏈表和迴圈雙鏈表)
3. 堆和棧
資料結構中的堆和棧與作業系統中的堆和棧是不同的概念
作業系統中記憶體分類:全域性區,區域性變數區,常量區,堆區,棧區,程式程式碼區等
(3.11) 作業系統中的堆:
[1] 由程式設計師分配釋放,效率較棧低但是可分配空間大而且操作靈活
[2] 堆:由低地址向高地址擴充套件的資料結構,是不連續的記憶體區域,分配方式類似於連結串列
[3] 存放在二級快取
(3.12) 資料結構中的堆
[1] 堆是樹形資料結構,每個節點都有一個值。有二叉樹和K叉樹堆
[2] 堆的特點:分為大頂堆和小頂堆。根節點的兩個子樹也是堆。資料操作比較隨意
[3] 順序儲存或非順序儲存,應用場景包括堆排序、優先佇列
(3.21) 作業系統中的棧
[1] 棧由系統自動分配,程式設計師無法控制。速度快但可支配空間小
[2] 棧:由高地址向低地址擴充套件的資料結構,是連續的記憶體區域,操作方式類似於資料結構中的棧
[3] 存放在一級快取
(3.22)資料結構中的棧
[1] 棧是一種先進後出的資料結構(LIFO),可以用陣列或者連結串列來實現
[2] 棧有順序棧和鏈棧兩種儲存結構,所以順序儲存或者非順序儲存,即順序儲存和鏈式儲存
[3] 資料操作:只能在棧頂進行插入和刪除操作
4. 佇列
順序儲存或非順序儲存
佇列有順序佇列和鏈隊
佇列是一種先進先出的資料結構(FIFO),可以用陣列或者連結串列來實現
資料操作:只允許在隊尾新增資料,隊頭刪除資料(有一種雙端佇列,兩端都可以插入和刪除)
Acknowledgements:
http://blog.csdn.net/hairetz/article/details/4141043/
http://blog.csdn.net/amork/article/details/7258216
2017.08.25