งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

AVL Tree. เป็น binary search tree ที่มี สำหรับแต่ละโนด – ความสูงของ left กับ right subtree ต่างกันได้อย่างมากแค่ 1 – ถ้า tree เป็น empty tree เราให้ height.

งานนำเสนอที่คล้ายกัน


งานนำเสนอเรื่อง: "AVL Tree. เป็น binary search tree ที่มี สำหรับแต่ละโนด – ความสูงของ left กับ right subtree ต่างกันได้อย่างมากแค่ 1 – ถ้า tree เป็น empty tree เราให้ height."— ใบสำเนางานนำเสนอ:

1 AVL Tree

2 เป็น binary search tree ที่มี สำหรับแต่ละโนด – ความสูงของ left กับ right subtree ต่างกันได้อย่างมากแค่ 1 – ถ้า tree เป็น empty tree เราให้ height เป็น -1 ความสูงของ AVL tree จะเป็น log N – ค่าจริงคือ 1.44log(N+2)-.328 เพราะว่าความสูงของ left กับ right subtree ต่างกันได้ อย่างมากแค่ 1 – จำนวนโนดที่น้อยที่สุดของต้นไม้ที่มีความสูง h, s(h) = s(h- 1)+s(h-2)+1 เมื่อ h=0, s(h) =1 เมื่อ h=1, s(h) =2 – คล้าย fibonacci

3 AVL Non-AVL 1 1 1 1

4 ฟังก์ชั่นต่างๆ O(log(N)) หมด ยกเว้นการ insert กับ remove ซึ่งอาจทำให้เสียความเป็น AVL ไป ใส่โนดใหม่เข้ามาทำให้เสียความเป็น AVL 0 1 1

5 แก้ความไม่เป็น AVL ด้วยการ rotate จากการ insert – โนดที่อยู่บนทางจากจุดที่ใส่ถึง root เท่านั้นที่มี ความสูงเปลี่ยน – ถ้าเราไล่ดูจากจุดที่ insert ขึ้นไป ก็จะพบโนดที่ เสียความเป็น AVL ที่อยู่ลึกสุด เราจะแก้ที่โนดนี้ โนดนี้มีได้สี่แบบเท่านั้น แก้ด้วย single rotation แก้ด้วย double rotation

6 Single rotation หลังจากการ insert a b X Y Z ดึงขึ้น a b X YZ ย้ายที่เกาะ ไปเกาะโนดเจ้าปัญหา แก้ได้แล้วก็ไม่ต้อง rotate ที่ไหนต่ออีก

7 ตัวอย่าง 1 5 2 1 8 47 3 6 0 1 1 เสีย AVL จากโนดนี้ 5 2 1 8 4 7 3 6

8 ตัวอย่าง 2 เริ่มจากไม่มีอะไร เรา insert 3,2,1 เสียความเป็น AVL To be continued 33 2 3 2 1 3 2 1 rotate

9 ต่อไปเรา insert 4,5 3 2 1 4 5 เสียความเป็น AVL To be continued 3 2 1 4 3 2 1 4 5

10 ต่อไปเรา insert 6 3 2 1 4 5 6 เสียความเป็น AVL rotate 3 2 1 4 5 6 To be continued

11 ต่อไปเรา insert 7 3 2 1 4 5 6 7 เสียความเป็น AVL rotate 3 2 1 4 5 6 7

12 Double rotation Single rotation ไม่ได้แล้ว a b Y X Z a b Y X Z Y ไม่เปลี่ยนระดับ

13 a b Y X Z c มีการ insert ดังนั้นต้องมีของ แน่ๆ a b X Z Y1Y2 โนดที่เจ๊ง

14 หมุนครั้งแรก c a b X Z Y1Y2 c a b X Z Y1 Y2

15 หมุนครั้งที่สอง c a b X Z Y1 Y2 c b X a Z Y1 Y2

16 ไม่รู้ว่าข้าง Y1 หรือ Y2 กันแน่ที่ทำให้เสีย แต่ก็ไม่ เป็นไรเพราะในตอนจบก็ลดระดับกันหมด ให้ c ปล่อย Y1,Y2 แล้วกระโดดขึ้นหิ้ว a กับ b แทน c a b X Z Y1Y2 c a b X Z Y1Y2 ส่วน Y1, Y2 ก็หาที่เกาะข้างๆ

17 ตัวอย่าง Insert 16,15 เสียความเป็น AVL ตอน insert 15 3 2 1 4 5 6 7 16 15 เจ๊ง rotate 3 2 1 4 5 6 15 167

18 Insert 14 3 2 1 4 5 6 15 167 14 เจ๊ง 3 2 1 4 5 6 15 16 7 14 ต้องเป็นตัวกระโดด rotate

19 Insert 13 เจ๊ง ขวาสองทีแบบนี้ใช้ single rotation 3 2 1 4 5 6 15 16 7 14 13 3 2 1 4 5 6 15 16 7 14 13 rotate

20 Insert 12 ก็ทำให้ต้อง single rotate อีก 3 2 1 4 5 6 15 16 7 14 13 12 เจ๊ง 3 2 1 4 5 6 15 16 7 14 13 12 rotate

21 Insert 11 ก็ทำให้ต้อง single rotate อีก 3 2 1 4 5 6 15 16 7 14 13 12 11 เจ๊ง rotate 3 2 1 4 5 6 15 16 7 14 13 12 11

22 Insert 10 ก็ทำให้ต้อง single rotate อีก 1 3 2 4 5 6 15 16 7 14 13 12 11 10 เจ๊ง rotate 1 3 2 4 5 6 15 16 7 14 13 12 11 10

23 Insert 8 ไม่มีอะไรเกิดขึ้น Insert 9 ต่อเลย ง่ายๆ 1 3 2 4 5 6 15 16 7 14 13 12 11 10 8 9 เจ๊ง 10 8 9

24 1. class AvlNode 2. { 3. // Constructors 4. AvlNode( Comparable theElement ) 5. { 6. this( theElement, null, null ); 7. } 8. AvlNode( Comparable theElement, AvlNode lt, AvlNode rt ) 9. { 10. element = theElement; 11. left = lt; 12. right = rt; 13. height = 0; 14. } 15. // Friendly data; accessible by other package routines 16. Comparable element; // The data in the node 17. AvlNode left; // Left child 18. AvlNode right; // Right child 19. int height; // Height 20. } เดี๋ยวต้องมีเมธอดที่รีเทิร์น height เพื่อเราจะได้ไม่ต้องวุ่นวายถ้าโนดที่ต้องการดูเป็น null

25 1. public class AvlTree 2. { private AvlNode root; 3. /** 4. * Construct the tree. 5. */ 6. public AvlTree( ) 7. { 8. root = null; 9. } 10. /** 11. * Insert into the tree; duplicates are ignored. 12. * @param x the item to insert. 13. */ 14. public void insert( Comparable x ) 15. { 16. root = insert( x, root ); 17. } ในหนังสือไม่มีการ remove

26 18. /** 19. * Find the smallest item in the tree. 20. * @return smallest item or null if empty. 21. */ 22. public Comparable findMin( ) 23. { 24. return elementAt( findMin( root ) ); 25. } 26. /** 27. * Find the largest item in the tree. 28. * @return the largest item of null if empty. 29. */ 30. public Comparable findMax( ) 31. { 32. return elementAt( findMax( root ) ); 33. } เมธอดเหมือน binary search Tree เยอะ ข้ามละกัน

27 1. /** 2. * Return the height of node t, or -1, if null. 3. */ 4. private static int height( AvlNode t ) 5. { 6. return t == null ? -1 : t.height; 7. } 8. /** 9. * Return maximum of lhs and rhs. 10. */ 11. private static int max( int lhs, int rhs ) 12. { 13. return lhs > rhs ? lhs : rhs; 14. } ฟังก์ชั่นช่วย

28 1. /** 2. * Internal method to insert into a subtree. 3. * @param x the item to insert. 4. * @param t the node that roots the tree. 5. * @return the new root. 6. */ 7. private AvlNode insert( Comparable x, AvlNode t ) 8. { 9. if( t == null ) 10. t = new AvlNode( x, null, null ); 11. else if( x.compareTo( t.element ) < 0 ) 12. { 13. t.left = insert( x, t.left ); 14. if( height( t.left ) - height( t.right ) == 2 ) 15. if( x.compareTo( t.left.element ) < 0 ) 16. t = rotateWithLeftChild( t ); 17. else 18. t = doubleWithLeftChild( t ); 19. } 20. Insert ถ้า ==2 เป็นจริง x ต้องอยู่ต่ำกว่านี้ t

29 21. else if( x.compareTo( t.element ) > 0 ) 22. { 23. t.right = insert( x, t.right ); 24. if( height( t.right ) - height( t.left ) == 2 ) 25. if( x.compareTo( t.right.element ) > 0 ) 26. t = rotateWithRightChild( t ); 27. else 28. t = doubleWithRightChild( t ); 29. } 30. else 31. ; // Duplicate; do nothing 32. t.height = max( height( t.left ), height( t.right ) ) + 1; 33. return t; 34. } t

30 1. /** 2. * Rotate binary tree node with left child. 3. * For AVL trees, this is a single rotation for case 1. 4. * Update heights, then return new root. 5. */ 6. private static AvlNode rotateWithLeftChild( AvlNode k2 ) 7. { 8. AvlNode k1 = k2.left; 9. k2.left = k1.right; 10. k1.right = k2; 11. k2.height = max( height( k2.left ), height( k2.right ) ) + 1; 12. k1.height = max( height( k1.left ), k2.height ) + 1; 13. return k1; 14. } k2 k1 k2 k1

31 1. /** 2. * Rotate binary tree node with right child. 3. * For AVL trees, this is a single rotation for case 4. 4. * Update heights, then return new root. 5. */ 6. private static AvlNode rotateWithRightChild( AvlNode k1 ) 7. { 8. AvlNode k2 = k1.right; 9. k1.right = k2.left; 10. k2.left = k1; 11. k1.height = max( height( k1.left ), height( k1.right ) ) + 1; 12. k2.height = max( height( k2.right ), k1.height ) + 1; 13. return k2; 14. } k1 k2 k1 k2

32 1. /** 2. * Double rotate binary tree node: first left child 3. * with its right child; then node k3 with new left child. 4. * For AVL trees, this is a double rotation for case 2. 5. * Update heights, then return new root. 6. */ 7. private static AvlNode doubleWithLeftChild( AvlNode k3 ) 8. { 9. k3.left = rotateWithRightChild( k3.left ); 10. return rotateWithLeftChild( k3 ); 11. } k2 k1 X Y1Y2 k3 Z k2 k3 k1 X Z Y1Y2 k2 k1 X Y1 Y2 k3 Z

33 1. /** 2. * Double rotate binary tree node: first right child 3. * with its left child; then node k1 with new right child. 4. * For AVL trees, this is a double rotation for case 3. 5. * Update heights, then return new root. 6. */ 7. private static AvlNode doubleWithRightChild( AvlNode k1 ) 8. { 9. k1.right = rotateWithLeftChild( k1.right ); 10. return rotateWithRightChild( k1 ); 11. } k2 k1 k3 X Z Y1Y2 k2 k3 X Y1 Y2 k1 Z k2 k3 X Y1 Y2 k1 Z


ดาวน์โหลด ppt AVL Tree. เป็น binary search tree ที่มี สำหรับแต่ละโนด – ความสูงของ left กับ right subtree ต่างกันได้อย่างมากแค่ 1 – ถ้า tree เป็น empty tree เราให้ height.

งานนำเสนอที่คล้ายกัน


Ads by Google