常用數據結構總結
數據結構 | 特性 | 備註 |
---|---|---|
數組 Array | 一維,多維數組;線性排列的數據 | 有序數組可以採用二分查找,提高效率 |
棧 Stack | 先進後出(FILO),後進先出(LIFO) | 在特定時刻只有一個數據項可以被讀取或者被刪除 |
隊列 Queue | 先進先出(FIFO) | 在特定時刻只有一個數據項可以被讀取或者被刪除 |
單向鏈表 | 從一端開始遍歷所有數據,適合單向存儲場景,例如HashMap | 搜索的複雜度和無序數組差不多。但是插入和刪除節點比無序數組快,因爲鏈表不需要移動任何東西 |
雙向鏈表 | 從兩端開始遍歷所有數據 適合雙向存儲場景,例如LinkedHashMap | 同單向鏈表 |
樹 | 可以分出多個樹枝,分出來的樹枝還可以再分 | 既能像鏈表那樣快速的插入和刪除,又能像有序數組那樣快速查找 |
二叉樹 | 一個節點的左子節點的關鍵字值小於這個節點,右子節點的關鍵字值大於或等於這個節點;插入一個節點需要根據這個規則進行插入 | 同樹 |
紅黑樹 | 1.節點都有顏色;2.在插入和刪除的過程中,要遵循保持這些顏色的不同排列的規則。例如Java8的HashMap | 同樹 |
小結:
- 數組:適合有讀寫,無序數組搜索效率不高,有序數組可以二分法搜索。但是插入和刪除某個節點效率低
- 鏈表:很適合有插入和刪除節點操作的場景。特別在複製時間遠大於比較時間的情形,還能解決內存使用率問題。但是搜索效率低
- 紅黑樹:解決二叉樹不平衡問題;既有鏈表的插入和刪除的效率,又有”有序數組”查詢的效率
PS:
強類型:存儲數據元素類型必須在初始化時指定。這樣在運行時,不需要耗費額外的時間來定義數組類型,能夠大大提升運行效率
各個算法的效率,請參看這裏數據結構和算法