基礎知識總結:常用容器集合類的算法談

常用的容器一般有一下幾種數據結構類型:

  • 動態數組:ArrayList內部就是動態數組,HashMap內部的鏈表數組也是動態擴展的,ArrayDeque和PriorityQueue內部也都是動態擴展的數組。
  • 鏈表:LinkedList是用雙向鏈表實現的,HashMap中映射到同一個鏈表數組的鍵值對是通過單向鏈表鏈接起來的,LinkedHashMap中每個元素還加入到了一個雙向鏈表中以維護插入或訪問順序。
  • 哈希表:HashMap是用哈希表實現的,HashSet, LinkedHashSet和LinkedHashMap基於HashMap,內部當然也是哈希表。
  • 排序二叉樹:TreeMap是用紅黑樹(基於排序二叉樹)實現的,TreeSet內部使用TreeMap,當然也是紅黑樹,紅黑樹能保持元素的順序且綜合性能很高。
  • :PriorityQueue是用堆實現的,堆邏輯上是樹,物理上是動態數組,堆可以高效地解決一些其他數據結構難以解決的問題。
  • 循環數組:ArrayDeque是用循環數組實現的,通過對頭尾變量的維護,實現了高效的隊列操作。
  • 位向量:EnumSet是用位向量實現的,對於只有兩種狀態,且需要進行集合運算的數據,使用位向量進行表示、位運算進行處理,精簡且高效。 

每種數據結構中往往包含一定的算法策略,這種策略往往是一種折中,比如:

  • 動態擴展算法:動態數組的擴展策略,一般是指數級擴展的,是在兩方面進行平衡,一方面是希望減少內存消耗,另一方面希望減少內存分配、移動和拷貝的開銷。
  • 哈希算法:哈希表中鍵映射到鏈表數組索引的算法,算法要快,同時要儘量隨機和均勻。
  • 排序二叉樹的平衡算法:排序二叉樹的平衡非常重要,紅黑樹是一種平衡算法,AVL樹是另一種,平衡算法一方面要保證儘量平衡,另一方面要儘量減少綜合開銷。

  • 動態數組:ArrayList內部就是動態數組,HashMap內部的鏈表數組也是動態擴展的,ArrayDeque和PriorityQueue內部也都是動態擴展的數組。
  • 鏈表:LinkedList是用雙向鏈表實現的,HashMap中映射到同一個鏈表數組的鍵值對是通過單向鏈表鏈接起來的,LinkedHashMap中每個元素還加入到了一個雙向鏈表中以維護插入或訪問順序。
  • 哈希表:HashMap是用哈希表實現的,HashSet, LinkedHashSet和LinkedHashMap基於HashMap,內部當然也是哈希表。
  • 排序二叉樹:TreeMap是用紅黑樹(基於排序二叉樹)實現的,TreeSet內部使用TreeMap,當然也是紅黑樹,紅黑樹能保持元素的順序且綜合性能很高。
  • :PriorityQueue是用堆實現的,堆邏輯上是樹,物理上是動態數組,堆可以高效地解決一些其他數據結構難以解決的問題。
  • 循環數組:ArrayDeque是用循環數組實現的,通過對頭尾變量的維護,實現了高效的隊列操作。
  • 位向量:EnumSet是用位向量實現的,對於只有兩種狀態,且需要進行集合運算的數據,使用位向量進行表示、位運算進行處理,精簡且高效。 

每種數據結構中往往包含一定的算法策略,這種策略往往是一種折中,比如:

  • 動態擴展算法:動態數組的擴展策略,一般是指數級擴展的,是在兩方面進行平衡,一方面是希望減少內存消耗,另一方面希望減少內存分配、移動和拷貝的開銷。
  • 哈希算法:哈希表中鍵映射到鏈表數組索引的算法,算法要快,同時要儘量隨機和均勻。
  • 排序二叉樹的平衡算法:排序二叉樹的平衡非常重要,紅黑樹是一種平衡算法,AVL樹是另一種,平衡算法一方面要保證儘量平衡,另一方面要儘量減少綜合開銷。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章