1. 程式人生 > >常見資料結構應用場景

常見資料結構應用場景

通用資料結構

可以簡單的按照速度將通用資料結構劃分為:陣列和連結串列(最慢),樹(較快),雜湊表(最快)。增、刪、改、查是四大常見操作,不過其實可以濃縮為兩個操作:增和查。刪除操作和和修改操作都是建立在查詢操作上的,所以完美的資料結構應該是具有較高的插入效率和查詢效率。

通用資料結構關係

可以根據下圖選擇合適的通用資料結構:

陣列

使用場景

陣列在以下三個情形下很有用:

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