1. 程式人生 > >常見數據結構使用場景

常見數據結構使用場景

隨機 Go 簡單 二叉查找樹 順序棧 開放 圖片 查找 blog

轉:https://www.cnblogs.com/lz3018/p/5932198.html

通用數據結構

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

通用數據結構關系

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

技術分享圖片

數組

使用場景

數組在以下三個情形下很有用:

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)。

分類: 數據結構和算法

常見數據結構使用場景