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

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

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

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 ตัวอย่าง เสีย AVL จากโนดนี้

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

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

10 ต่อไปเรา insert เสียความเป็น AVL rotate To be continued

11 ต่อไปเรา insert เสียความเป็น AVL rotate

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 เจ๊ง rotate

18 Insert เจ๊ง ต้องเป็นตัวกระโดด rotate

19 Insert 13 เจ๊ง ขวาสองทีแบบนี้ใช้ single rotation rotate

20 Insert 12 ก็ทำให้ต้อง single rotate อีก เจ๊ง rotate

21 Insert 11 ก็ทำให้ต้อง single rotate อีก เจ๊ง rotate

22 Insert 10 ก็ทำให้ต้อง single rotate อีก เจ๊ง rotate

23 Insert 8 ไม่มีอะไรเกิดขึ้น Insert 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. 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. 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. 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. x the item to insert. 4. t the node that roots the tree. 5. 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 * 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 * 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 * 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 * 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