170 likes | 447 Views
外張樹. 外張樹是一種二元搜尋樹. 藍色區域所有的鍵值都 ≥ 20. 請注意,兩個擁有相同數值的鍵值,可能相距遙遠. BST 規則: 條目只儲存於內部節點上 儲存於 v 左子樹節點的鍵值,小於等於 v 所儲存的鍵值 儲存於 v 右子樹節點的鍵值,大於等於 v 所儲存的鍵值 中序走訪會依順序回傳鍵值. 黃色區域所有的鍵值都 ≤ 20. 在外張樹中進行搜尋 : 一開始與在 BST 中相同. 搜尋會在樹中向下前進,直到找到項目或達到外部節點為止 例子 : 搜尋鍵值 11. BST 的搜尋範例 ( 續 ). 搜尋鍵值 8 ,終止於內部節點.
E N D
外張樹 外張樹
外張樹是一種二元搜尋樹 藍色區域所有的鍵值都 ≥ 20 請注意,兩個擁有相同數值的鍵值,可能相距遙遠 • BST規則: • 條目只儲存於內部節點上 • 儲存於v左子樹節點的鍵值,小於等於v所儲存的鍵值 • 儲存於v右子樹節點的鍵值,大於等於v所儲存的鍵值 • 中序走訪會依順序回傳鍵值 黃色區域所有的鍵值都≤ 20 外張樹
在外張樹中進行搜尋:一開始與在BST中相同 • 搜尋會在樹中向下前進,直到找到項目或達到外部節點為止 • 例子:搜尋鍵值11 外張樹
BST的搜尋範例 (續) • 搜尋鍵值8,終止於內部節點 外張樹
外張樹會在每次操作之後進行旋轉 (即便是搜尋) • 新的操作:外張 • 外張會利用旋轉將節點移動到根節點 • 向右旋轉 • 令節點y的左子節點x成為y的父節點,y則成為x的右子節點 • 向左旋轉 • 令節點x的右子節點y成為x的父節點,x則成為y的左子節點 外張樹
外張: • 「x是左左孫節點」意指x是其父節點的左子節點,而後者本身也是其父節點的左子節點 • p 為 x的父節點,g 為 p的父節點 外張樹
各種外張情形的視覺化表示 zig zig zig zig 外張樹
外張範例 1. (旋轉前) • 令 x = (8,N) • x為其父節點的右子節點,其父節點則為其祖父節點的左子節點 • 繞著p向左旋轉,然後繞著g向右旋轉 2. (第一次旋轉後) 3. (第二次旋轉後) x 還不是根節點,所以我們會再次進行外張 外張樹
2. (旋轉後) 1. (進行旋轉前) x 為根節點了,所以停止 外張範例(續) • 現在 x 是根節點的左子節點 • 繞著根節點向右旋轉 外張樹
外張的範例結果 之前 • 樹可能不會更平衡 • 例如外張 (40,X) • 之前,最淺的葉節點深度為3,最深的為7 • 之後,最淺的葉節點深度為1,最深的為8 第一次外張後 第二次外張後 外張樹
外張樹的定義 • 外張樹是一種節點在存取 (搜尋或更新) 之後會被外張的二元搜尋樹 • 所存取之最深的內部節點會被外張 • 外張花費 O(h) 時間,其中 h 為樹的高度 – 在最糟狀況下仍為 O(n) • O(h) 次旋轉,每次為 O(1) 外張樹
外張樹與有序字典 • 在每次操作之後,有哪些節點會被外張? 外張樹
外張樹的攤銷分析 • 每次操作的執行時間正比於進行外張的時間 • 定義 rank(v) 為 以 v 為根節點之子樹上節點數目的對數 (以 2 為底) • 時間成本:zig = $1, zig-zig= $2, zig-zag= $2 • 因此,外張深度為d的節點,成本 = $d. • 想像我們在外張樹的每個節點 v 上,都存了 rank(v) 元的電子幣 (只是為了分析之便) 外張樹
每次 zig 的成本 • 在 x 進行一次 zig 成本最多為 rank’(x) - rank(x): • 成本 = rank’(x) + rank’(y) - rank(y) - rank(x) < rank’(x) - rank(x). 外張樹
每次 zig-zig 與 zig-zag 的成本 • 在 x 進行一次 zig-zig 或 zig-zag 的成本最多為 3(rank’(x) - rank(x)) - 2. • 證明:參見書籍 zig zig zig zig 外張樹
外張的成本 • 在根節點為 r 的樹中,外張深度為 d 的節點 x 的成本: • 最多為 3(rank(r) - rank(x)) - d + 2: • 證明:外張 x 會花費 d/2 次外張的次步驟: 外張樹
外張樹的效能 • 回想:節點的排位是其大小的對數 • 因此,任何外張操作的攤銷成本為 O(log n) • 事實上,此項分析對於任何合理的rank(x)定義來說都是成立的 • 這意味著外張樹確實可以進行調整,以在某些情況下用遠快於 O(log n) 的速度對於常用的項目進行搜尋 外張樹