ดาวน์โหลดงานนำเสนอ
งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ
1
ต้นไม้เอวีแอล (AVL Tree)
2
หัวข้อ นิยามต้นไม้เอวีแอล การวิเคราะห์ความสูงของต้นไม้เอวีแอล
การปรับต้นไม้เอวีแอลให้สูงสมดุล กระบวนการหมุนปม
3
ต้นไม้ค้นหาแบบทวิภาค
เวลาการทำงานเป็น O(h) log2 n h n – 1 โชคดีทำงานเร็ว O(log n), โชคร้ายทำงานช้า O(n) 4 5 2 6 1 3 2 1 6 4 3 5 3 2 5 4 6 1
4
ต้นไม้เอวีแอล hL hR AVL = Binary Search Tress + กฎความสูงสมดุล
ต้นไม้ย่อยทุกต้นต้องเป็นไปตามกฎ AVL : Adelson-Velskii and Landis
5
ตัวอย่างต้นไม้เอวีแอล
-1 -1 1 2 1 -1 -1 -1 -1 2 2 1 -1 1 1 -1 1 -1 -1 1 -1 -1 ต้นไม้ว่าง (null) สูง -1
6
ต้นไม้ค้นหาแบบทวิภาคกับเอวีแอล
ต้นไม้ค้นหาแบบทวิภาคที่สร้างจากข้อมูลสุ่ม 1000 ตัว ต้นไม้เอวีแอลที่สร้างจากข้อมูลสุ่ม 1000 ตัว
7
ต้นไม้เอวีแอลสูงเท่าใด ?
ให้ Fh คือต้นไม้เอวีแอลซึ่งสูง h ที่มีจำนวนปมน้อยสุด F0 F1 F2 F3 F4 Fh – 2 Fh – 1 Fh |Fh| = 1 + |Fh–1| + |Fh–2| Fibonacci Tree
8
ความสูงของต้นไม้ฟิโบนักชี
สรุป : ต้นไม้เอวีแอลที่มี n ปม สูงไม่เกิน 1.44 log2n log2 n hAVL 1.44 log2 n
9
ทำอย่างไรให้เป็นไปตามกฎของ AVL
การเพิ่ม/ลบข้อมูลทำเหมือน BSTree แต่หลังการเพิ่ม/ลบ อาจทำให้ผิดกฎสูงสมดุล ถ้าผิดกฎ ต้องปรับต้นไม้ 9 5 6 8 1 3 2 1 2 5 3 1 2 5 3 6 8 6 8 9 6 8
10
โครงสร้างปมของต้นไม้เอวีแอล
struct SAVLNode; typedef struct SAVLNode *AVLNode; struct SAVLNode { DType data; int height; AVLNode left; AVLNode right; }; AVLNode newAVLNode(DType d, AVLNode left, AVLNode right) { AVLNode n = (AVLNode) malloc(sizeof(struct SAVLNode)); n->data = d; n->left = left; n->right = right; setHeightAVLNode(n); // ---> next page return n; } void freeAVLNode(AVLNode n) { free(n); แต่ละปมมีความสูงกำกับ
11
โครงสร้างปมของต้นไม้เอวีแอล
int getHeightAVLNode(AVLNode n) { // the height of NULL is -1 return (n == NULL ? -1 : n->height); } void setHeightAVLNode(AVLNode n) { int hL = getHeightAVLNode(n->left); int hR = getHeightAVLNode(n->right); n->height = 1 + (hL > hR ? hL : hR); int balanceValue(AVLNode n) { return getHeightAVLNode(n->right) – getHeightAVLNode(n->left); +1 -1 -2 +2
12
การหมุนปม การปรับต้นไม้อาศัยการหมุน (rotation)
การหมุนปมยังคงรักษาความเป็นต้นไม้ค้นหา r r 20 99 10 5 10 5 20 99 15 15 rotateLeftChild(r) rotateRightChild(r)
13
rotateLeftChild( r ) (1) r newRoot newRoot 5 99 15 5 15 99
AVLNode rotateLeftChild(AVLNode r) { AVLNode newRoot = r->left; r->left = newRoot->right; newRoot->right = r; setHeightAVLNode(newRoot->right); setHeightAVLNode(newRoot); return newRoot; } (1) r 20 10 5 15 99 newRoot 10 20 5 15 99 newRoot
14
rotateRightChild( r ) (1) r newRoot newRoot 99 5 15 99 5 15
AVLNode rotateRightChild(AVLNode r) { AVLNode newRoot = r->right; r->right = newRoot->left; newRoot->left = r; setHeightAVLNode(newRoot->left); setHeightAVLNode(newRoot); return newRoot; } (1) r 10 20 99 15 5 newRoot 20 10 99 15 5 newRoot
15
add และ remove ใช้ rebalance
AVLNode _addAVL(AVL t, AVLNode r, DType x) { ... // same as _addBST r = rebalance(r); return r; } AVLNode _removeAVL(AVL t, AVLNode r, DType x) { ... // same as _removeBST เพิ่มตามปกติ แล้วค่อยปรับ ลบตามปกติ แล้วค่อยปรับ rebalance มี 4 กรณี
16
rebalance : กรณีที่ 1 5 2 6 1 3 5 2 6 1 3 5 2 6 1 3 r x x r C A B B C
5 2 6 1 3 x r B C A r x C B A rotateLeftChild(r)
17
rebalance : กรณีที่ 2 3 5 2 6 4 3 5 2 6 4 9 3 5 2 6 4 9 r x x r C A B
rotateRightChild(r)
18
rotateRightChild(r->left)
rebalance : กรณีที่ 3 5 2 6 1 3 5 2 6 1 3 4 5 2 6 1 3 4 5 2 6 1 3 4 x r D A B C y r D A B C y x r D A B C y x rotateRightChild(r->left) rotateLeftChild(r)
19
rotateLeftChild(r->right)
rebalance : กรณีที่ 4 2 5 1 6 4 2 5 1 6 4 3 2 5 1 6 4 3 2 5 1 6 4 3 x r A D C B y r A D C B y x r A D C B y x rotateLeftChild(r->right) rotateRightChild(r)
20
rebalance (1) x r B C A D y AVLNode rebalance(AVLNode r) {
rotateRightChild(r) rotateLeftChild(r.right) x r B C A D y AVLNode rebalance(AVLNode r) { if (r == NULL) return r; int balance = balanceValue(r); if (balance == -2) { if (balanceValue(r->left) == 1) r->left = rotateRightChild(r->left); r = rotateLeftChild(r); } else if (balance == 2) { if (balanceValue(r->right) == -1) r->right = rotateLeftChild(r->right); r = rotateRightChild(r); } setHeightAVLNode(r); return r; (1) x r D A B C y rotateLeftChild(r) x r B C A rotateRightChild(r->left) rotateLeftChild(r)
21
ตัวอย่าง 1, 2, 3, 6, 8, 4, 15, 14 1 2 2 3 1 6 1 1 2 3 2 3 1 2 3 1 6 8 2 6 1 8 3 2 3 1 6 8 4 3 6 8 4 2 1 15 2 6 1 8 3 4 3 6 8 4 2 1 3 6 8 4 2 1 15 14 3 6 8 4 2 1 14 15 3 6 4 2 1 14 15 8
22
สรุป ต้นไม้เอวีแอลคือต้นไม้ค้นหาที่ถูกควบคุมความสูง
ผลต่างความสูงของลูกสองข้างห้ามเกินหนึ่ง พิสูจน์ได้ว่า log2 n h < 1.44 log2 n แต่ละปมเก็บความสูงไว้ตรวจสอบ ถ้าหลังเพิ่ม/ลบข้อมูลแล้วผิดกฎ, ให้ปรับต้นไม้ การปรับต้นไม้อาศัยการหมุนปม เวลาการทำงานของการเพิ่ม ลบ และค้นเป็น O(log n)
งานนำเสนอที่คล้ายกัน
© 2024 SlidePlayer.in.th Inc.
All rights reserved.