能夠簡單的按照速度將通用數據結構劃分爲:數組和鏈表(最慢),樹(較快),哈希表(最快)。增、刪、改、查是四大常見操做,不過其實能夠濃縮爲兩個操做:增和查。刪除操做和和修改操做都是創建在查找操做上的,因此完美的數據結構應該是具備較高的插入效率和查找效率。數組
能夠根據下圖選擇合適的通用數據結構:數據結構
數組在如下三個情形下頗有用:性能
1)數據量較小。spa
2)數據規模已知。操作系統
3)隨機訪問,修改元素值。blog
若是插入速度很重要,選擇無序數組。若是查找速度很重要,選擇有序數組,並使用二分查找。隊列
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)。