三種平衡樹的區別與聯絡

2022-10-10 06:24:09 字數 1137 閱讀 7614

雖然他叫 fhq-treap 但實際上跟 treap 沒啥關係。

fhq-treap 就是無旋轉的 treap,問題來了,如何和保持平衡呢。

這裡就要介紹兩個函式了,mergesplit

split就是將一棵樹按照某關鍵值**成平衡的兩棵樹。

某關鍵值就兩種,一種按排名**,一種按照關鍵值**,這裡主要介紹按照關鍵值**

令 \(x\) 與 \(y\) 表示要**的兩棵子樹的編號。\(k\) 表示那個關鍵值。\(now\) 表示以這個樹以 \(now\) 為根節點**。

我們開始遍歷,當我們遍歷到乙個結點時,判斷他的權值是否小於 \(k\) ,如果小於 \(k\) 的話,那麼我們把這個節點的子樹扔到**出來的兩棵樹中權值小於 \(k\) 的那棵。否則的話,我們把這個節點的子樹扔到**出來的兩棵樹中權值小大於 \(k\) 的那棵。

就這樣從根節點開始遞迴,直到遞迴到葉節點時結束。

merge就是將**的兩棵樹合併起來,成一棵平衡的樹。

令 \(x\) 與 \(y\) 表示我要合併的那兩棵樹的編號。

我們先按照 treap 給每個節點賦予乙個隨即權值。

我們假設第一棵樹的權值小於第二棵樹的權值,那麼我們就比較它們的隨機權值。如果 \(rnd_l,我們就保留它的左子樹,把另一棵樹丟過去作為另外乙個節點的的右子樹;如果 \(rnd_l \ge rnd_r\) ,那我們可以保留第二棵樹的右子樹,另一顆樹作為它的左子樹。

注意,合併的時候不僅要保持點權平衡,還要保持隨機權值的平衡。

講完了這兩個關鍵的函式,那麼剩下的就很簡單了。

插入:我們將要插入的元素 \(a\) 設為乙個獨立的樹,將其與當前的樹合併即可。

刪除:刪除權值為 \(a\) 的點,先把整顆樹以 \(a\) 為權值split成兩棵樹 \(x,y\),再把 \(x\) 樹按照 \(a-1\) 分成 \(c,d\) 。這時候值為 \(a\) 的點一定為 \(d\) 的根,那麼我們把 \(d\) 的兩個子兒子 merge 起來,再把他們重新 merge 起來得到乙個新的樹,這顆樹就去除掉了\(a\) 的影響,即刪除了 \(a\) 。

三種DSO的區別

資料從源抽取到標準dso中時,在同一抽取請求中,相同業務主鍵的資料會合併 合併的方式有覆蓋與合計,合計又可為min max sum中的一種,具體轉換規則中可為哪一種合計,則要看key figure中的aggregation聚合中設定的是哪一種合計方式,具體請參考 key figure中的aggreg...

三種Python IDE的區別

剛學習了python,感覺很簡單也很有趣,一開始說這是小學生都可以學習的語言我還不信,現在信了信了。上課老師說了一款python ide pycharm 這是一專注於python的整合開發環境pycharm,是來自jetbrains公司的全功能python開發環境。過去的15年裡jetbrains一...

三種app的區別

開發成本低中 高維護更新 簡單簡單 複雜體驗差中 優store或marke認可 不認可認可 認可安裝 不需要需要 需要跨平台優優 差 混合開發有兩種開發模式 h5主導 只需要h5開發工程師,借助一些封裝好的工具實現應用的打包與呼叫原生裝置的功能,如hbuilder的雲端打包功能。優點 1.方便更新又...