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

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

Data Structure and Algorithms

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


งานนำเสนอเรื่อง: "Data Structure and Algorithms"— ใบสำเนางานนำเสนอ:

1 Data Structure and Algorithms
Chapter 1 Chapter 7 ต้นไม้ (Tree) 235012 Data Structure and Algorithms

2 โครงสร้างทั่วไปของต้นไม้
Non-Linear Data Structure Hierarchical Relationship Root - จุดยอดของต้นไม้ Node - จุดที่มีการแตกกิ่งก้านสาขาออกไป Branch or Link - กิ่งก้านสาขาที่เชื่อมต่อระหว่างโหนด

3 ลักษณะของโครงสร้างข้อมูลแบบต้นไม้
Root Node Branch/ Link

4 การเรียกชื่อส่วนต่างๆ ของต้นไม้
โหนดราก (Root Node) โหนดแรกของต้นไม้ โหนดแม่(Parent Node) node ที่มี degree > 0 โหนดลูก Children) node ที่อยู่ลำดับล่างของอีกโหนดหนึ่ง โหนดพี่น้อง (sibling) โหนดที่อยู่ในระดับเดียวกันมีโหนดแม่ร่วมกัน โหนดใบ (Leaf Node) node ที่มี degree = 0

5 การเรียกชื่อส่วนต่างๆ ของต้นไม้
ระดับ Level ระยะทางจาก ราก จนถึงโหนดนั้นๆ ความสูง (height) หรือ ความลึก (depth) ระดับสูงสุดของโหนดใบ บวกด้วย 1 ส่วนย่อยของต้นไม้ (Sub trees) โหนดที่อยู่ในตำแหน่งสืบทอดของโหนดที่เป็นราก

6 ส่วนย่อยของต้นไม้ (Sub-Tree)
ทุกโหนดเป็น root ของ sub-tree ของตัวมันเอง R เป็น root ของ subtree A,B,C,D A เป็น root ของ subtree E,F,G F เป็น root ของ subtree J C เป็น subtree ที่มีแต่ root C

7 Root Parents Leaves Children sibling (A) (B) (H) (C) (E)

8 ต้นไม้แบบทวิภาค (Binary Tree)
Tree ที่แต่ละ node มีจำนวน sub tree <= 2 (แต่ละ node มี degree <= 2 )

9 Empty หรือ Null Tree

10 Fig.A Fig.B 1 1 2 3 2 4 4 3 4 2 3 4 4

11 ต้นไม้สำหรับค้นหาแบบทวิภาค (Binary Search Tree)
7 5 12 1 3 9 17

12 การแทนต้นไม้แบบทวิภาคในคอมพิวเตอร์
การแทนโดยอาศัยอาร์เรย์ ใช้อาร์เรย์ 3 อาร์เรย์ในการจัดเก็บ ใช้อาร์เรย์ 1 มิติอาร์เรย์เดียวในการจัดเก็บ การแทนโดยอาศัย Linklisted

13 การแทนโดยใช้อาร์เรย์ 3 อาร์เรย์ในการจัดเก็บ
จะใช้อาร์เรย์ที่มีขนาดเท่ากันจำนวน 3 ชุด คือ data – เก็บข้อมูลในแต่ละ node left – เก็บตำแหน่งของ node ลูกทางด้านซ้ายมือ right – เก็บตำแหน่งของ node ลูกทางด้านขวามือ ถ้า node ใดไม่มี node ลูก ให้เก็บค่า 0 (แทน NULL) และใช้ตัวแปร root เก็บตำแหน่งของ node แรกใน tree

14 A B C D E F G H root data left right 1 1 A 2 3 2 B 6 4 3 C 7 4 E 8 5 5
ตัวอย่าง ข้อมูลในหน่วยความจำ General binary tree root data left right A 1 1 A 2 3 2 B 6 4 B C 3 C 7 4 E 8 5 5 H D E F 6 D 7 F G H 8 G

15 การแทนโดยใช้อาร์เรย์ 1 มิติอาร์เรย์เดียวในการจัดเก็บ
กำหนดตำแหน่งช่องในอาร์เรย์ให้แต่ละ node โดย เริ่มตั้งแต่ level 0 , 1 , … , k ตามลำดับ แต่ละ level จะเริ่มจาก node ทางด้านซ้ายสุดไปถึงโหนดทางขวาสุด ตามลำดับ ลักษณะเป็นการนับช่องจากบนลงล่าง, ซ้ายไปขวา การกำหนดตำแหน่งเช่นนี้จะไม่สนใจว่ามีข้อมูลของโหนดนั้นจริงหรือไม่ (Fix ตำแหน่งอาร์เรย์ไว้)

16 ตัวอย่าง general binary tree A B C D E G F H I 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ข้อมูลในหน่วยความจำ A B C D E - F G H I 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

17 จะได้ความสัมพันธ์ระหว่าง tree และ อาร์เรย์ ดังนี้
ถ้า binary tree มีความสูงเท่ากับ h จะต้องใช้อาร์เรย์ที่มีขนาด 2h – 1 ในการจัดเก็บ parent ของโหนด i ใดๆ จะอยู่ที่ตำแหน่ง i/2 ถ้า i ไม่เท่ากับ 1 left child ของโหนด i ใดๆ จะอยู่ที่ตำแหน่ง 2i right child ของโหนด i ใดๆ จะอยู่ที่ตำแหน่ง 2i + 1

18 การแทนโดยอาศัย link listed
เป็นวิธีการจัดเก็บที่มีประสิทธิภาพ เนื่องจากไม่เกิดปัญหาการจองข้อมูลมากหรือน้อยเกินไป โดยข้อมูลแต่ละ node ของ tree จะประกอบไปด้วย data – เก็บข้อมูลในแต่ละ node Lptr – เก็บ address ของ node ลูกทางด้านซ้ายมือ Rptr – เก็บ address ของ node ลูกทางด้านขวามือ

19 ตัวอย่าง

20 ใช้อาร์เรย์ที่มีขนาดเท่ากันจำนวน 3 ชุด
Assignment : จงเขียนภาพแสดงการจัดเก็บข้อมูลในหน่วยความจำ Binary Tree ด้วยวิธีต่อไปนี้ ใช้อาร์เรย์ที่มีขนาดเท่ากันจำนวน 3 ชุด ใช้อาร์เรย์ 1 มิติอาร์เรย์เดียวในการจัดเก็บ การแทนโดยอาศัย link-listed

21 เฉลย !!! root data left right 5 5 A 4 3 4 B 2 1 3 C -1 2 D -1 -1 1 E
ใช้อาร์เรย์ที่มีขนาดเท่ากันจำนวน 3 ชุด root data left right 5 5 A 4 3 4 B 2 1 3 C -1 2 D -1 -1 1 E -1 -1 F -1 -1 เฉลย !!! ใช้อาร์เรย์ 1 มิติอาร์เรย์เดียวในการจัดเก็บ A B C D E F

22 เฉลย !!! การแทนโดยอาศัย link-listed  A  B  C null null D null E
F เฉลย !!!

23 ใช้อาร์เรย์ที่มีขนาดเท่ากันจำนวน 3 ชุด
Assignment : จงเขียนภาพแสดงการจัดเก็บข้อมูลในหน่วยความจำ Binary Tree ด้วยวิธีต่อไปนี้ ใช้อาร์เรย์ที่มีขนาดเท่ากันจำนวน 3 ชุด ใช้อาร์เรย์ 1 มิติอาร์เรย์เดียวในการจัดเก็บ การแทนโดยอาศัย pointer

24 เฉลย !!! root data left right 2 1 7 2 5 3 2 4 6 5 9 6 5 7 11 8 4
จากการข้อมูลในอาร์เรย์ต่อไปนี้ เขียนเป็นโครงสร้างข้อมูล Binary Tree ได้อย่างไร root data left right 2 1 7 2 5 3 2 4 6 5 9 6 5 เฉลย !!! 7 11 8 4

25 จากการข้อมูลในอาร์เรย์ต่อไปนี้ เขียนเป็นโครงสร้างข้อมูล Binary Tree ได้อย่างไร
เฉลย !!! 2 7 5 6 9 11 4

26 ต้นไม้แบบทวิภาค (Binary tree)
Binary tree traversals Expression Tree Binary Search Tree (BST) AVL Tree Heaps

27 ต้นไม้แบบทวิภาค (binary tree)
หมายถึง tree ที่แต่ละ node มีจำนวน subtree <= 2 ( แต่ละ node มี degree <= 2 )

28 Empty หรือ Null Tree

29 Complete และ Nearly Complete Binary Tree

30 Binary tree traversals
1. Depth-first traversals เป็นการท่องเข้าไปในทรีด้วยการเดินทางจากรูทโหนดไปยังโหนดลูก ๆ 2. Breath-first traversals ประมวลผลทีละ Level จากบนลงล่าง

31 Depth-first traversals
มีการบัญญัติคำย่อเพื่อใช้งานดังนี้ N แทน root node L แทน left sub tree R แทน right sub tree มี 3 วิธีที่นิยมใช้กันอย่างแพร่หลาย Pre-order traversals In-order traversals Post-order traversals

32 Depth-first tarversals
N L R L N R L R N

33 แบบ Pre-order N L R algorithm preOrder (val root <node pointer>)
1 if (root is not null) 1 process(root) 2 preOrder(root->leftSubtree) 3 preOrder(root->rightSubtree) 2 return

34 แบบ Pre-Order Traversal
N L R R X A D C G start stop Y Result R A C D X Y G

35 แบบ Inorder L N R algorithm inOrder (val root <node pointer>)
1 if (root is not null) 1 inOrder(root->leftSubtree) 2 process(root) 3 inOrder(root->rightSubtree) 2 return

36 แบบ In-Order Traversal
L N R R X A D G start stop C Y Result C A D R G Y X

37 แบบ Post-order L R N algorithm postOrder (val root <node pointer>) 1 if (root is not null) 1 postOrder(root->leftSubtree) 2 postOrder(root->rightSubtree) 3 process(root) 2 return

38 แบบ Post-Order Traversal
L R N start R stop A X C D Y G Result C D A G Y X R

39 Pre-order – NLR In-order – LNR Post-order - LRN A B C D G E F H I A B

40 Pre-order – NLR In-order – LNR Post-order - LRN 2 7 2 6 5 5 9 4 2 7 5
11 5 9 4 2 7 5 6 11 2 5 4 9 2 5 11 6 7 4 9 5 2

41 Breath-first algorithm breathFirst (val root <node pointer>)
1 p = root 2 while (p not null) 1 process(p) 2 if (p->left not null) 1 enqueue(p->left) 3 if (p->right not null) 1 enqueue(p->right) 4 if (not emptyQueue) 1 dequeue(p) else 1 p = null 3 return

42 A B C D G E F H I Breath-first A B C D E F G H I

43 Expression Tree หมายถึง Binary Tree ที่มีคุณสมบัติดังต่อไปนี้
1. Leaf เก็บ Operand 2. Root และ Internal node เก็บ Operator 3. Subtree เป็น Sub expression

44 ตัวอย่าง

45 การท่องใน Expression Tree
1. Pre-order Traversal 2. Post-order Traversal 3. In-order Traversal Prefix Expression Postfix Expression Infix Expression

46 Pre-order Traversal + * a + b c d 1 if (root is not null)
1 print(root->token) 2 prefix(root->leftSubtree) 3 prefix(root->rightSubtree) 2 return + * a + b c d

47 Post-order Traversal a b c + * d + 1 if (root is not null)
1 postfix(root->leftSubtree) 2 postfix(root->rightSubtree) 3 print(root->token) 2 return a b c + * d +

48 Inorder Traversal ( ( a * ( b + c ) ) + d ) 1 if (root is not null)
1 if root->token is operand 1 print(root->token) else 1 print(open parenthesis) 2 infix(root->leftSubtree) 3 print(root->token) 4 infix(root->rightSubtree) 5 print(close parenthesis) 2 return ( ( a * ( b + c ) ) + d )

49 Pre-fix Expression (NLR)
Assignment + A - * D B C จงหา Expression ของ Binary Tree นี้ Pre-fix Expression (NLR) Infix Expression (LNR) Postfix Expression (LRN) + A - * B C D A + B * C - D A B C * D - +

50 General Tree หมายถึง Tree ที่สามารถมี degree ได้ไม่จำกัดจำนวน

51 การแปลง General Tree เป็น Binary Tree
ขั้นตอน 1. ระบุ chide ที่อยู่ด้านซ้ายสุด 2. ให้เชื่อม node ที่มีพ่อเดียวกัน ( node พี่น้อง) เข้าด้วยกัน - ลบเส้นเชื่อมโยงจาก node ที่เป็นพ่อไปยังลูก ๆ ออกให้หมด ยกเว้น ลูกที่อยู่ตำแหน่งซ้ายสุด 3. เลือก son ทางซ้ายและขวา ของแต่ละ node - son ทางซ้าย คือ node ที่อยู่ใต้ node นั้น - son ทางขวา คือ node ที่อยู่ข้าง ๆ (ระดับเดียวกัน / Brother )

52 ตัวอย่าง การแปลง General Tree เป็น Binary Tree

53 การแปลง Tree ไปเป็น Binary Tree
เริ่มต้น A B D E F G T C H 1.ให้เชื่อม node ที่มีพ่อเดียวกัน ( node พี่น้อง) เข้าด้วยกัน

54 ขั้นที่ 1 A D B C T G H F E 1.ให้เชื่อม node ที่มีพ่อเดียวกัน ( node พี่น้อง) เข้าด้วยกัน

55 ขั้นที่ 1-1 A D B C T G H F E 1. ลบเส้นเชื่อมโยงจาก node ที่เป็นพ่อไปยัง ลูก ๆ ออกให้หมด ยกเว้น ลูกที่อยู่ตำแหน่งซ้ายสุด

56 A B C E D F G H T ขั้นที่ 2 เลือก son ทางซ้ายและขวา ของแต่ละ node
- son ทางซ้าย คือ node ที่อยู่ใต้ node นั้น - son ทางขวา คือ node ที่อยู่ข้าง ๆ (ระดับเดียวกัน / Brother )

57 แบบฝึกหัด จงแปลง Tree ให้เป็น Binary Tree 1 2 6 10 7 3 4 5 8 9

58 แบบฝึกหัด-เฉลย จงแปลง Tree ให้เป็น Binary Tree 1 2 6 10 7 3 4 5 8 9

59 Binary Search Tree เป็น binary tree ที่มีคุณสมบัติพิเศษ คือ
ทุก node ของ subtree ทางซ้ายมีค่าน้อยกว่า root ทุก node ของ subtree ทางขวามีค่ามากกว่าหรือเท่ากับ root ทุก ๆ subtree เป็น binary search tree >

60 ตัวอย่าง Binary Search Tree ที่ถูกต้อง

61 ตัวอย่าง Binary Search Tree ที่ไม่ถูกต้อง

62 ประโยชน์ของ Binary Search Tree
ต้องการค้นหาข้อมูล 1 ตัวจากข้อมูลทั้งหมด 100,000 ตัว เก็บในอาร์เรย์ : อาจต้องค้นหา 100,000 ครั้ง ค้นหาในอาร์เรย์ทีละช่อง เก็บใน BST : ลดจำนวนการค้นหาลงได้สูงสุดเหลือเพียง 17 ครั้ง(โดยประมาณ) ถ้า root แบ่งข้อมูลเป็น 2 ส่วนเท่าๆกัน ค้นครั้งที่ 1 เหลือข้อมูล ½ ค้นครั้งที่ 2 เหลือข้อมูล ¼ ...

63 สิ่งที่ควรทราบเพิ่มเติมเกี่ยวกับ binary search tree
ถ้าเป็น BST ที่ลูกทางด้านซ้ายมีค่าน้อยกว่าพ่อแม่ เรา สามารถใช้ inorder traversal เพื่อหาข้อมูลที่เรียงลำดับกัน ได้ ถ้าต้องการหาข้อมูลที่มีค่าน้อยที่สุด สามารถหาได้ leaf ที่ อยู่ทางด้านซ้ายสุดของทรี หรือจะเท่ากับ root ของ subtree ทางด้านซ้ายสุด ถ้ากรณี subtree นั้นไม่มีโหนด ลูกทางด้านซ้าย ในทำนองเดียวกัน เราก็สามารถหาข้อมูลที่มีค่ามากที่สุดได้ เช่นเดียวกัน

64 operation ที่ต้องทำใน BST
BST มี operation ที่สำคัญอยู่ 2 operation คือ การเพิ่มโหนด เพิ่มแล้วโหนดใหม่ต้องเป็น Leaf เท่านั้น เพิ่มในตำแหน่งที่ยังคงคุณสมบัติของ Binary Search Tree ไว้ การลบโหนด

65 ตัวอย่าง การเพิ่มข้อมูลใน Binary Search Tree

66

67 การลบโหนด ใน BST ต้องพิจารณาว่า Node ที่จะลบนั้นตรงกับกรณี
1. ไม่มี Child 2. มีเฉพาะ Right Subtree 3. มีเฉพาะ Left Subtree 4. มีทั้ง Left และ Right Subtree <== ลบได้เลย <== ดึง Right Subtree ขึ้นมา <== ดึง Left Subtree ขึ้นมา นำค่าที่มากที่สุดของ Left Subtree มาแทน

68 ตัวอย่าง กรณีที่ 1 ไม่มีโหนดลูก
23 18 X 44 before delete 44 23 X 18 after delete 44

69 ตัวอย่าง กรณีที่ 2 มีเฉพาะ right subtree
23 18 X 44 before delete 44 46 58 after delete 44 23 18 X 46 58

70 ตัวอย่าง กรณีที่ 3 มีเฉพาะ left subtree
23 18 X 44 before delete 44 36 28 23 18 X after delete 44 36 28

71 ตัวอย่าง กรณีที่ 4 มีโหนดลูกทั้ง 2 ข้าง
23 18 44 X before delete 23 20 10 20 18 X 44 after delete 23 10

72 การสร้าง BST insert 10 insert 15 insert 8 10 X 10 X 15 10 15 X 8
เช่น insert 10 insert 15 insert 8 10 X 10 X 15 10 15 X 8

73 insert 14 10 15 X 8 14 insert 12 10 15 X 8 14 13 12 insert 13 10 15 X 8 14 13

74 ตัวอย่าง 65 40 75 30 55 70 95 35 80

75 ADD 40 ซ้ำ !! 1. ทิ้งไปเลย 65 40 75 30 55 70 95 35 80

76 2 . เก็บความถี่ Node ที่ซ้ำ
ADD 40 2 . เก็บความถี่ Node ที่ซ้ำ 65 ซ้ำ !! 2 40 75 30 55 70 95 35 80

77 ADD 40 3. ใช้ Link list มาเชื่อม 65 40 40 75 ซ้ำ !! 30 55 70 95 35 80

78 แบบฝึกหัด สร้าง Binary Search Tree จากการ Add ข้อมูลตามลำดับ

79 คุณภาพของ BST ขึ้นอยู่กับการกระจายค่าของข้อมูล
เช่น ชุดข้อมูล 10 X 12 18 24 25

80 ข้อเสีย : ความเร็วในการค้นหาข้อมูลจะแย่ (กรณีแย่ ที่สุดคือต้องเปรียบเทียบ n ครั้ง)
ปี 1960 นักคณิตศาสตร์ชาวรัสเซียได้พัฒนาเทคนิคใน การจัดรูปแบบของ BST โดยปรับแต่งโหนดให้สมดุล หรือเกือบสมดุล ทุกครั้งที่มีการเพิ่มหรือลบข้อมูล และ ยังคงคุณสมบัติของ BST อยู่ เรียกต้นไม้ชนิดนี้ว่า AVL tree หรือ ต้นไม้ความสูงสมดุล

81 AVL tree (Adel’son, Vel’skii and Landis)
Height-balanced binary search tree หรือ ต้นไม้ความ สูงสมดุล คือ BST ชนิดหนึ่งที่มีคุณสมบัติเพิ่มเติมคือ ทุก subtree มี balance factor (bf) แตกต่างกันไม่เกิน 1 [-1, 0, +1] bf คือ ความสูงของ left subtree ลบด้วย ความสูงของ right subtree bf = | HL - HR | | bf | <= 1

82 -7 1 -6 1 -1 -5 -4 -3 -2 -1

83 AVL tree unbalanced BST

84 การเพิ่ม , ลบโหนดออกจาก AVL Tree
ใช้วิธีการเดียวกันกับการเพิ่ม , ลบ โหนดจาก BST การเพิ่ม – เพิ่มที่ตำแหน่งที่เป็น leaf เท่านั้น การลบ – มี 4 กรณี หลังจากเพิ่ม – ลบ โหนดทุกๆ ครั้ง ต้องสร้าง Balancing Tree เพื่อคงคุณสมบัติของ AVL Tree

85 Balancing Tree (หลักการทำต้นไม้ให้สมดุล)
คือการปรับต้นไม้ที่ไม่เป็น AVL tree ให้เป็น AVL tree ( | bf | <= 1 , | HL - HR | <= 1 ) เกิดขึ้นทุกครั้งหลังการเพิ่มหรือลบโหนด ซึ่งทำให้ต้นไม้ ขาดคุณสมบัติของ AVL tree ไป มีกรณีที่ต้องจำอยู่ 4 กรณี คือ - SLR (single left rotation) - SRR (single right rotation) - DLR (double left rotation) - DRR (double right rotation)

86 SLR (single left rotation)
ใช้ในกรณีที่โหนดล่างสุด ที่ไม่สมดุลมี bf = -2 (right subtree ของโหนดนี้สูงกว่า left subtree อยู่ 2) ดังนั้นจึงต้องมีการหมุนไปทางซ้าย และโหนดลูกทางด้านขวาของโหนดข้างบนมี bf = -1 (right subtree ของโหนดนี้ก็ยังสูงกว่า left subtree อยู่ 1) ซึ่งหมายความว่าต้นไม้มีการเอียงไปทางด้านขวา ตลอด ดังนั้นจึงหมุนไปทางซ้ายแค่ครั้งเดียว

87 เปลี่ยนตำแหน่งของ subtree B
กรณีมี 3 โหนด (-2) (0) 10 20 (-1) 20 (0) (0) (0) 30 10 30 เปลี่ยนตำแหน่งของ subtree B กรณีทั่วไป (-2) 10 (-1) (0) 20 20 A (0) (-1,1) (-1,1) 30 10 30 B C D A B C D

88 SLR

89 SRR (single right rotation)
ใช้ในกรณีที่โหนดล่างสุดที่ไม่สมดุลมี bf = 2 (left subtree ของโหนดนี้สูงกว่า right subtree อยู่ 2) ดังนั้นจึงต้องมีการหมุนไปทางขวา และโหนดลูกทางด้านซ้ายของโหนดนี้มี bf = 1 (left subtree ของโหนดนี้ก็ยังสูงกว่า right subtree อยู่ 1) ซึ่งหมายความว่าต้นไม้มีการเอียงไปทางด้านซ้าย ตลอด ดังนั้นจึงหมุนไปทางขวาแค่ครั้งเดียว

90 เปลี่ยนตำแหน่งของ subtree C
กรณีมี 3 โหนด (2) 30 (0) 20 (1) 20 (0) (0) (0) 10 10 30 กรณีทั่วไป เปลี่ยนตำแหน่งของ subtree C (2) 30 (1) (0) 20 20 D (0) (-1,1) (-1,1) 10 30 10 C A A C B B D

91 SRR

92 DLR (double left rotation)
ใช้ในกรณีที่โหนดล่างสุด ที่ไม่สมดุลมี bf = -2 (right subtree ของโหนดนี้สูงกว่า left subtree อยู่ 2) ดังนั้นจึงต้องมีการหมุนไปทางซ้าย แต่โหนดลูกทางด้านขวาของโหนดข้างบน มี bf = 1 (right subtree ของโหนดลูกกลับต่ำกว่า left subtree อยู่ 1) ซึ่งหมายความว่าต้นไม้มีการ เอียงไปทางด้านขวาและด้านซ้าย ดังนั้นจึงหมุน ไปทางซ้าย 2 ครั้ง

93 เปลี่ยนตำแหน่งของ subtree B,C
กรณีมี 3 โหนด (-2) 10 (0) 20 (1) 30 (0) (0) (0) 20 10 30 เปลี่ยนตำแหน่งของ subtree B,C กรณีทั่วไป (-2) 10 (1) (0) 30 20 A (1,0) (0,-1) (-1,1) 20 10 30 D B C A C D B

94 DLR case ที่ 1

95 DLR + case ที่ 2

96 DRR (double right rotation)
ใช้ในกรณีที่โหนดล่างสุดที่ไม่สมดุลมี bf = 2 (left subtree ของโหนดนี้สูงกว่า right subtree อยู่ 2) ดังนั้นจึงต้องมีการหมุนไปทางขวา แต่โหนดลูกทางด้านซ้ายของโหนดนี้ มี bf = -1 (left subtree ของโหนดนี้กลับต่ำกว่า right subtree อยู่ 1) ซึ่งหมายความว่าต้นไม้มีการเอียงไปทางด้านซ้ายและ ด้านขวา ดังนั้นจึงหมุนไปทางขวา 2 ครั้ง

97 เปลี่ยนตำแหน่งของ subtree B,C
กรณีมี 3 โหนด (2) 30 (0) 20 (-1) 10 (0) (0) (0) 20 10 30 เปลี่ยนตำแหน่งของ subtree B,C กรณีทั่วไป (2) 30 (-1) (0) 20 10 D (0,1) (-1,0) (1,-1) 10 30 A 20 A C C B D B

98 DRR case ที่ 1

99 DRR case ที่ 2

100 Heaps หัวข้อวันนี้ Heaps โครงสร้างของ heap heap operation
Reheap Up , Reheap Down การแทน heap ในหน่วยความจำ heap sort (application of heap) ข้อดีของ heap sort

101 Heap คือ binary tree ที่มีคุณสมบัติ คือ
แต่ละ subtree ค่าของ root >= child เสมอ  (Max-heap) หรือ แต่ละ subtree ค่าของ root <= child เสมอ  (Min-heap) เป็น complete binary tree หรือ nearly complete binary tree Heap ไม่ใช่ binary search tree

102 ต้นไม้ทวิภาคแบบสมบูรณ์ (complete binary tree)
คือ binary tree ที่มี node เต็มทุก level (ทุก node ที่ไม่ใช่ leaf มี child ทั้งด้านซ้ายและด้านขวา) nearly complete binary tree คือ binary tree ที่มี node เต็มทุก level ยกเว้น level สุดท้าย และ node ใน level สุดท้ายอยู่เรียงกันทางซ้ายมือ

103

104 โครงสร้างของ Max-heap
ค่าที่มากที่สุดอยู่ที่ root เสมอ < <

105 โครงสร้างของ Min-heap
ค่าที่น้อยที่สุดอยู่ที่ root เสมอ > >

106 ตัวอย่าง Heap ที่ถูกต้อง

107 ตัวอย่าง Tree ที่ไม่ใช่ Heap

108 Heap Operation 1. Insert & Reheap Up
Insert โหนดใหม่ที่ level ล่างสุด ณ ตำแหน่งว่างด้านซ้ายสุด (ทำให้ยังคงสภาพของ nearly complete หรือ complete binary tree อยู่) Reheap Up ปรับ tree หลังจาก insert ให้เป็น heap 2. Delete & Reheap Down Delete ที่ Root เท่านั้น และนำ Node ที่ level ล่างสุดตำแหน่งขวาสุดขึ้นมาแทน (ทำให้ยังคงสภาพของ nearly complete หรือ complete binary tree อยู่) Reheap Down ปรับ tree หลังจาก delete ให้เป็น heap

109 Reheap Up สลับที่ระหว่างโหนดที่ insert เข้ามากับ Parent ของมันเองตามหลักของ heap ทำซ้ำกับโหนดเดิมจนกว่าจะอยู่ตำแหน่งที่ถูกต้อง a heap

110 ตัวอย่าง

111 Reheap Down สลับที่ระหว่างโหนดที่ตำแหน่ง root (โหนดที่พึ่งสลับที่มาหลังจาก delete) กับโหนดลูกของมันเองจนกว่าโหนดนั้นจะอยู่ตำแหน่งที่ถูกต้อง (เลือกโหนดลูกตามหลักของ heap) ทำซ้ำจนกว่า root จะอยู่ตำแหน่งที่ถูกต้อง a heap

112 ตัวอย่าง Delete

113

114 การแทน heap ในหน่วยความจำ
นิยมแทน heap ลงในอาร์เรย์ 1 มิติ เนื่องจากคุณสมบัติของการเป็น nearly complete ของตัวมันเอง ข้อมูลที่จัดเก็บลงในอาร์เรย์จะเรียงต่อกันไปตามลำดับจากซ้ายไปขวาของแต่ละ level ใน heap จะได้ความสัมพันธ์ของตำแหน่งข้อมูลใน heap คือ parent ของโหนด i ใดๆ = i/2 ถ้า i <> 1 left child ของโหนด i ใดๆ = 2i right child ของโหนด i ใดๆ = 2i + 1

115 [1] [2] [3] [4] [5] [6] [7] [1] [2] [3] [4] [1] [5] [6] [7]

116 Heap sort (Application of heap)
สำหรับ heap ข้อมูลที่มีค่าสูงสุด/ต่ำสุดจะเก็บอยู่ที root คุณสมบัติดังกล่าว + ลักษณะการเก็บข้อมูล สามารถนำมาช่วยในการเรียงลำดับข้อมูลได้ นำข้อมูลเข้าในลักษณะของ heap จนหมด delete ทีละโหนด จนหมด ข้อมูลที่ delete จะสลับที่กับโหนดสุดท้ายแทน ลำดับของข้อมูลที่ delete เรียงจาก มาก -> น้อย ค่าในอาร์เรย์ เรียงจาก น้อย -> มาก

117 กำหนดให้ข้อมูลนำเข้าคือ 14 , 70 , 32 , 100 , 65 , 56
ขั้นที่ 1 นำข้อมูลเข้า heap ทีละโหนดจนหมด 1. insert 14 2. insert 70 3. reheap up 14 70 70 14 14 4. insert 32 5. insert 100 6. reheap up 70 14 32 70 14 32 100 100 70 32 14

118 7. insert 56 7. insert 65 100 70 32 14 65 56 100 70 32 14 65 8. reheap up 100 70 56 14 65 32 ในหน่วยความจำ 100 70 56 14 65 32

119 ขั้นที่ 2 delete ข้อมูลทีละโหนดจนหมด (สลับกับโหนดสุดท้ายแทนตัดจาก heap )
2. reheap down 32 70 56 14 65 100 70 65 56 14 32 100 3. delete 70 4. reheap down 32 65 56 14 70 100 65 32 56 14 70 100

120 5. delete 65 6. reheap down 14 32 56 65 70 100 56 32 14 65 70 100 7. delete 56 8. reheap down 14 32 56 65 70 100 32 14 56 65 70 100

121 9. delete 32 14 32 56 65 70 100 เหลือโหนดเดียว ไม่ต้องปรับ heap 10. delete 14 14 32 56 65 70 100 สิ้นสุดการทำงาน ข้อมูลเรียงลำดับแล้ว

122 [1] [2] [3] [4] [5] [6] ขั้นที่ 1 สร้าง heap 1. insert 14 14
ดังนั้นจากตัวอย่างข้างต้น สิ่งที่จะเกิดในหน่วยความจำจะเป็นการเปลี่ยนแปลงค่าข้อมูลในอาร์เรย์แทน [1] [2] [3] [4] [5] [6] ขั้นที่ 1 สร้าง heap 1. insert 14 14 2. insert 70 70 3. reheap up

123 [1] [2] [3] [4] [5] [6] 4. insert 32 70 14 32 5. insert 100 100 6. reheap up 7. insert 65 65 8. insert 56 56 9. reheap up ขั้นที่ 2 delete heap 1. สลับ 100 กับ 32 2. ปรับ heap

124 [1] [2] [3] [4] [5] [6] 3. สลับ 70 กับ 32 32 65 56 14 70 100 4. ปรับ heap 5. สลับ 65 กับ 14 6. ปรับ heap 7. สลับ 56 กับ 14 8. ปรับ heap 9. สลับ 32 กับ 14 10. ปรับ heap 11. สิ้นสุดการเรียงลำดับ

125 การบ้าน 1. จงสร้าง min-heap จากข้อมูลต่อไปนี้ จงแสดงวิธีการลบข้อมูลจาก min-heap ที่ได้จากข้อ 1 ทีละขั้นตอน


ดาวน์โหลด ppt Data Structure and Algorithms

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


Ads by Google