[算法学习] 线段树,树状数组,数堆,笛卡尔树
都是樹的變種,用途不同
【線段樹 Interval Tree】
區間管理,是一種平衡樹
可看做是對一維數組的索引進行管理。一維數組不需要是排序好的
深度不超過logL
任一個區間(線段)都分成不超過2logL條線段
優點:在O(log L)時間內完成一條線段的插入、刪除、查找、求和等
適用于和區間統計有關的問題。但是該問題必須是可以分解成不同子區間的問題的綜合
?
【樹狀數組】
解決需求:頻繁的求某一段之和,并且需要對數組進行動態的增加和刪減結點
求和的時間復雜度減低為log N
增刪結點的時間復雜度保持為log N?(但是常數項可能會很大。如果多次增刪結點,可考慮改用線段樹)
?
【樹堆】
解決需求:通過“隨機”保持排序二叉樹的平衡性,保持檢索的高效性
類似于排序二叉樹
但是結點保存的數據為<key, value>
從key的角度看,是一棵排序二叉樹,即,左子節點key<=父節點key <右子節點key
從value角度看,是一個最大堆,即,父節點value >= 子結點value
建樹過程:給每個結點賦一個隨機的value,先按排序二叉樹的插入方法插入,然后調整使之滿足最大堆的性質。通過旋轉實現。每個結點插入時的時間復雜度為O(lg N),N為已有的節點數
?
【笛卡爾樹】
和數堆很像。但是需求不同,建樹過程也不同
解決需求:未知
建樹過程:時間復雜度可以為O(N),N為所有的節點數
先按key從小到大排列,然后依次插入樹。保留一個數據棧,棧底是根節點,從棧底到棧頂依次是從根節點出來的右子路徑。
每次要插入的結點,根據value值找它應該插入的位置。
?
?
?
?
轉載于:https://www.cnblogs.com/chenhuanfa/p/3413387.html
總結
以上是生活随笔為你收集整理的[算法学习] 线段树,树状数组,数堆,笛卡尔树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL语句判断数据库、表、字段是否存在
- 下一篇: this.parentNode.next