STL_set集合容器+map映照容器
set集合容器使用一種紅黑樹(Red-Black Tree)的平衡二叉檢索樹的數據結構,來組織泛華的元素數據。元素數據的檢索,使用二叉檢索樹得中序遍歷算法,檢索的效率高于vector、deque和list等容器。
?
紅黑樹的節點結構:
color??? left?? parent?? right?? data?? (顏色? 左指針? 父指針? 右指針? 數據域)
?
紅黑樹在二叉檢索樹基礎上做的補充定義:(不要求子節點必須是黑色)
1、根節點是黑色
2、其他節點是紅色或者黑色
3、每個紅色節點的左右節點必須是黑色
4、每條從葉子節點到根節點的路經,都包含相同數目的黑色節點。
注:由性質3,紅黑樹的任何路經都不會出現兩個相鄰的紅色節點;由性質4,紅黑樹的所有從根節點到葉子結點的路徑中,最長路經不會超過最短路徑的2倍。
如圖,為了提供end函數返回的迭代器,在紅黑樹的結構上增設了一個頭結點,該頭結點的位置就是end函數的返回值,即最后一個原色的下一位置。頭結點的left指針指向紅黑樹的最左節點(即鍵值最小的節點),right指向指針的最右節點(鍵值最大的節點),parent指針指向紅黑樹的根節點。頭結點為紅色。
?
建樹過程:一般是每次插入一個新節點(黑色根節點除外),都著色為紅色。然后,再檢查紅黑樹的定義規則是否被破壞,否則要進行子樹的左右旋轉以作平衡處理。
插入節點:新節點必須先“著色”為紅色,因此,當父節點也是紅色節點時,所插入的新節點就會破壞原來的紅黑樹平衡。所以需要從當前插入位置開始上溯到根節點為止,檢查是否有父子節點連續出現紅色,如果是則進行相應的節點位置調整,使其節點“著色”滿足定義要求。
紅黑平衡調整函數(Rb_tree_rebalance):
1、當父節點和叔父節點都是紅色時,插入節點x,由于x必須是紅色,破壞了紅黑樹的定義要求。因此,可將父節點和叔父節點都改為黑色,祖父節點改為紅色,從而使x到其祖父節點符合紅黑樹的定義。然后繼續在祖父節點處往上執行平衡函數循環處理,直至頭結點。
2、父節點紅色叔父節點黑色時,由于原紅黑樹平衡,所以祖父節點為黑色。此時,插入節點x,出現沖突。為此現將父節點改為紅色,而叔父節點改為紅色。但是仍不能滿足紅黑樹路徑黑節點數相同的要求,再將x右轉,即以x的祖父節點為軸右旋轉,從而將黑色節點數維持為原紅黑樹的平衡數目。
注:其中1、2又分為父節點為左子樹和右子樹? 兩種情況。
刪除節點:每刪除一個節點,也必須要考慮紅黑平衡。
注:其中的find函數找所有節點中>=k并且<=k的節點處。
set插入節點調用:insert_unique();
multiset插入調用:insert_equal();
?
剛看完set數據集,馬上來到map映照容器。
map容器元素的數據結構:鍵值+映照數據
map的元素可通過pair封裝成一個結構對象,map容器要做的就是將這個pair對象插入到紅黑樹,完成一個元素的添加。同時,也要提供一個僅使用鍵值進行比較的函數對象,傳遞給紅黑樹。由此,可利用紅黑樹操作,將map元素數據插入到二叉樹中的正確位置,也可根據鍵值進行元素的刪除的檢索。
總結:map跟set的基礎數據結構一樣,只是在其上增長成為pair,而且map還定義了數組的“【】”操作符,不僅可用鍵值的方式訪問元素的映照數據,還可以用來添加map容器的元素。
multimap:多重映照容器。使用紅黑樹的insert_equal函數插入元素。允許元素鍵值的重復插入,使得數組操作符“【】”利用鍵值訪問失去意義,所以multimap并沒有定義數組方式的“【】”操作運算。
紅黑樹插入算法復雜度:查找復雜度:O(lgn)+修復復雜度(O(1),O(lgn))=O(lgn);
紅黑樹刪除算法復雜度:查找復雜度:O(lgn)+修復復雜度(O(1),O(lgn))=O(lgn);
轉載于:https://www.cnblogs.com/weiyi-mgh/p/6506957.html
總結
以上是生活随笔為你收集整理的STL_set集合容器+map映照容器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Javascript 思维导图 绘制基础
- 下一篇: 关键字、标识符