常見數據結構使用場景
轉: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)。
分類: 數據結構和算法
常見數據結構使用場景