本篇隨筆簡單講解一下splay演算法維護平衡樹時的旋轉操作。重點集中在如何模擬旋轉。
對splay沒有概念的同學請移步:
splay詳解
先上圖再講:
這是右旋。
ch[x][0],ch[x][1]//x的左右兒子
fa[x]//x的爹
val[x]//x的值
size[x]//x的子樹大小
我們觀察旋轉後的東西,發現對於全部節點來講,他們的值都是沒有變的(...)。所以我們不用修改值。
然後我們發現對於部分節點(d,c),它們的爹和兒子包括子樹大小都沒有任何變化。這倆點就不用管。
那麼對於其他點來講,我們需要按照上面這個圖來進行模擬,修改它們的兒子、父親和子樹大小資訊。怎麼改呢?
改的時候要遵循幾個規則:
首先,就是被賦值的資訊,以後不能再被呼叫(因為已經被覆蓋掉了),也就是變化的順序問題。
比如如果上面的右旋,我們先把b的右兒子改成a,再把a的左兒子改成e。我們發現做不到,因為當b的右兒子變成a之後,e就被覆蓋掉了,換句話說,我們找不到e了,自然就沒辦法把a的左兒子改成e了。
但是,如果先把a的左兒子改成e,再把b的右兒子改成a,因為b是我們要操作的節點,所以它無論如何是可以被找到的。這樣我們就可以完成這個旋轉的操作了。
別忘了還要更新父親的資訊和子樹資訊。
最後,還要特判,因為我們的splay旋轉還有單旋和雙旋的區分,也就是說,雖然我們是三個點在旋轉,但是在最後(馬上到根節點)的情況下,是會出現只有兩個點旋轉的情況的,所以要特殊判斷z節點(x節點的祖父節點)是否存在,存在的話才嫩更新其兒子,不存在的話沒有兒子可以更新。
所以,**就是:
void rotate(int x)
Splay的一些操作
推薦 簡單的定義 fa x 為x的父親,son x 0 1 為x的左右兒子 簡單的操作 get x 查詢x為父親的哪乙個兒子 int get int x rotate x 將x旋轉到父親 void rotate int x splay x,goal 將x旋轉到goal的兒子 void splay i...
旋轉矩陣的演算法
旋轉矩陣是計算機圖形學裡面的基礎內容。之前我還寫過一篇計算機圖形學基礎知識的總結 操作的步驟可以分為兩部,一是沿正對角線對稱,二是沿水平對稱軸對稱 原圖 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 第一步之後 1 5 9 13 2 6 10 14 3 7 11 15...
作業系統頁面置換演算法模擬
一 實驗目的通過模擬實現請求頁式儲存管理的幾種基本頁面置換演算法,了解虛擬儲存技術的特點,掌握虛擬儲存請求頁式儲存管理中幾種基本頁面置換演算法的基本思想和實現過程,並比較它們的效率。二 實驗內容 設計乙個虛擬儲存區和記憶體工作區,並使用下述演算法計算訪問命中率。1 最佳淘汰演算法 opt 2 先進先...