常見資料結構應用場景
通用資料結構
可以簡單的按照速度將通用資料結構劃分為:陣列和連結串列(最慢),樹(較快),雜湊表(最快)。增、刪、改、查是四大常見操作,不過其實可以濃縮為兩個操作:增和查。刪除操作和和修改操作都是建立在查詢操作上的,所以完美的資料結構應該是具有較高的插入效率和查詢效率。
通用資料結構關係
可以根據下圖選擇合適的通用資料結構:
陣列
使用場景
陣列在以下三個情形下很有用:
1)資料量較小。
2)資料規模已知。
3)隨機訪問,修改元素值。
如果插入速度很重要,選擇無序陣列。如果查詢速度很重要,選擇有序陣列,並使用二分查詢。
缺點
1)需要預先知道資料規模
2)插入效率低,因為需要移動大量元素。
連結串列
解決的問題
連結串列的出現解決了陣列的兩個問題:
1)需要預先知道資料規模
2)插入效率低
使用場景
1)資料量較小
2)不需要預先知道資料規模
3)適應於頻繁的插入操作
缺點
1)有序陣列可以通過二分查詢方法具有很高的查詢效率(O(log n)),而連結串列只能使用順序查詢,效率低下(O(n))。
二叉查詢樹
解決的問題
1)有序陣列具有較高的查詢效率(O(log n)),而連結串列具有較高的插入效率(頭插法,O(1)),結合這兩種資料結構,建立一種貌似完美的資料結構,也就是二叉查詢樹。
使用場景
1)資料是隨機分佈的
2)資料量較大
3)頻繁的查詢和插入操作(可以提供O(log n)級的查詢、插入和刪除操作)
缺點
1)如果處理的資料是有序的(升序/降序),那麼構造的二叉查詢樹就會只有左子樹(或右子樹),也就是退化為連結串列,查詢效率低下(O(log n))。
平衡樹
解決的問題
1)針對二叉查詢樹可能會退化為連結串列的情況,提出了平衡樹,平衡樹要求任意節點的左右兩個子樹的高度差不超過1,避免退化為連結串列的情況。
使用場景
1)無論資料分佈是否隨機都可以提供O(log n)級別的查詢、插入和刪除效率
2)資料量較大
缺點
1)平衡樹的實現過於複雜。
雜湊表
解決的問題
同平衡樹一樣,雜湊表也不要求資料分佈是否隨機,不過雜湊表的實現比平衡樹要簡單得多。
使用場景
1)不需要對最大最小值存取。
2)無論資料分佈是否隨機,理想情況下(無衝突)可以提供O(1)級別的插入、查詢和刪除效率。
3)資料量較大
缺點
1)由於是基於陣列的,陣列(雜湊表)建立後難以擴充套件,使用開放地址法的雜湊表在基本被填滿時,效能下降的非常嚴重。
2)不能對最大最小值存取。
通用資料儲存結構
專用資料結構
棧
順序棧
優點
1)在輸入資料量可預知的情形下,可以使用陣列實現棧,並且陣列實現的棧效率更高,出棧和入棧操作都在陣列末尾完成。
缺點
1)如果對陣列大小建立不當,可能會產生棧溢位的情況
鏈棧
優點
1)不會發生棧溢位的情況
2)輸入資料量未知時,使用鏈棧。通過頭插法實現入棧操作,頭刪法實現出棧操作。出棧和入棧均是O(1)。
缺點
1)由於入棧時,首先要建立插入的節點,要向作業系統申請記憶體,所以鏈棧沒有順序棧效率高。
佇列
如果資料量已知就使用陣列實現佇列,未知的話就使用連結串列實現佇列。出隊和入隊均是O(1)。
資料結構 | 優點 | 缺點 |
陣列 | 插入快 | 查詢慢、刪除慢、大小固定 |
有序陣列 | 查詢快 | 插入慢、刪除慢、大小固定 |
棧 | 後進先出 | 存取其他項很慢 |
佇列 | 先進先出 | 存取其他項很慢 |
連結串列 | 插入、刪除快 | 查詢慢 |
二叉樹 | 查詢、插入、刪除快 | 演算法複雜(刪除演算法) |
紅黑樹 | 查詢、插入、刪除快 | 演算法複雜 |
hash表 | 存取極快(已知關鍵字)、插入快 | 刪除慢、不知關鍵字時存取很慢、對儲存空間使用不充分 |
堆 | 插入快、刪除快、對大資料項存取快 | 對其他資料項存取慢 |
圖 | 依據現實世界建模 | 演算法有些複雜 |
AVL樹 | 查詢、插入、刪除快 | 演算法複雜 |
--------------------- 本文來自 Flammable_ice 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/z84616995z/article/details/70153460?utm_source=copy