สมัครเรียนโทร. 085-350-7540 , 084-88-00-255 , ntprintf@gmail.com

Tree

Tree ใน Data Structures - Tree คืออะไร Tree ใน Data Structures - Binary Tree คืออะไร Tree ใน Data Structures - Binary Search Tree (BST) คืออะไร Tree ใน Data Structures - การสร้าง Binary Search Tree Tree ใน Data Structures - การค้นหาข้อมูลใน Binary Search Tree Tree ใน Data Structures - การแทรกข้อมูลใน Binary Search Tree Tree ใน Data Structures - การลบข้อมูลใน Binary Search Tree Tree ใน Data Structures - Balanced Tree คืออะไร Tree ใน Data Structures - AVL Tree คืออะไร Tree ใน Data Structures - การสร้าง AVL Tree Tree ใน Data Structures - การปรับสมดุล AVL Tree Tree ใน Data Structures - Red-Black Tree คืออะไร Tree ใน Data Structures - การทำงานของ Red-Black Tree Tree ใน Data Structures - B-Tree คืออะไร Tree ใน Data Structures - B+ Tree คืออะไร Tree ใน Data Structures - การประยุกต์ใช้งาน Tree ในการแก้ปัญหา เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลแบบไดนามิคใน C ผ่าน Tree เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลแบบไดนามิคใน C++ ผ่าน Tree เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลแบบไดนามิคใน Java ผ่าน Tree เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลแบบไดนามิคใน C# ผ่าน Tree เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลแบบไดนามิคใน VB.NET ผ่าน Tree เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลแบบไดนามิคใน Python ผ่าน Tree เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลแบบไดนามิคใน Golang ผ่าน Tree เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลแบบไดนามิคใน JavaScript ผ่าน Tree เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลแบบไดนามิคใน Perl ผ่าน Tree เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลแบบไดนามิคใน Lua ผ่าน Tree เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลแบบไดนามิคใน Rust ผ่าน Tree เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลในภาษา Php โดยใช้ Tree พร้อมยก code มาเป็นตัวอย่างสำหรับการ insert, update ข้อมูล , ค้นหา find, delete และอธิบายการทำงานสั้นๆ พร้อมทั้งบอกข้อดีข้อเสีย เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลในภาษา Next โดยใช้ Tree พร้อมยก code มาเป็นตัวอย่างสำหรับการ insert, update ข้อมูล , ค้นหา find, delete และอธิบายการทำงานสั้นๆ พร้อมทั้งบอกข้อดีข้อเสีย เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลในภาษา Node.is โดยใช้ Tree พร้อมยก code มาเป็นตัวอย่างสำหรับการ insert, update ข้อมูล , ค้นหา find, delete และอธิบายการทำงานสั้นๆ พร้อมทั้งบอกข้อดีข้อเสีย เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลในภาษา fortran โดยใช้ Tree พร้อมยก code มาเป็นตัวอย่างสำหรับการ insert, update ข้อมูล , ค้นหา find, delete และอธิบายการทำงานสั้นๆ พร้อมทั้งบอกข้อดีข้อเสีย เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลในภาษา Delphi Object Pascal โดยใช้ Tree พร้อมยก code มาเป็นตัวอย่างสำหรับการ insert, update ข้อมูล , ค้นหา find, delete และอธิบายการทำงานสั้นๆ พร้อมทั้งบอกข้อดีข้อเสีย เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลในภาษา MATLAB โดยใช้ Tree พร้อมยก code มาเป็นตัวอย่างสำหรับการ insert, update ข้อมูล , ค้นหา find, delete และอธิบายการทำงานสั้นๆ พร้อมทั้งบอกข้อดีข้อเสีย เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลในภาษา Swift โดยใช้ Tree พร้อมยก code มาเป็นตัวอย่างสำหรับการ insert, update ข้อมูล , ค้นหา find, delete และอธิบายการทำงานสั้นๆ พร้อมทั้งบอกข้อดีข้อเสีย เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลในภาษา Kotlin โดยใช้ Tree พร้อมยก code มาเป็นตัวอย่างสำหรับการ insert, update ข้อมูล , ค้นหา find, delete และอธิบายการทำงานสั้นๆ พร้อมทั้งบอกข้อดีข้อเสีย เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลในภาษา COBOL โดยใช้ Tree พร้อมยก code มาเป็นตัวอย่างสำหรับการ insert, update ข้อมูล , ค้นหา find, delete และอธิบายการทำงานสั้นๆ พร้อมทั้งบอกข้อดีข้อเสีย เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลในภาษา Objective-C โดยใช้ Tree พร้อมยก code มาเป็นตัวอย่างสำหรับการ insert, update ข้อมูล , ค้นหา find, delete และอธิบายการทำงานสั้นๆ พร้อมทั้งบอกข้อดีข้อเสีย เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลในภาษา Dart โดยใช้ Tree พร้อมยก code มาเป็นตัวอย่างสำหรับการ insert, update ข้อมูล , ค้นหา find, delete และอธิบายการทำงานสั้นๆ พร้อมทั้งบอกข้อดีข้อเสีย เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลในภาษา Scala โดยใช้ Tree พร้อมยก code มาเป็นตัวอย่างสำหรับการ insert, update ข้อมูล , ค้นหา find, delete และอธิบายการทำงานสั้นๆ พร้อมทั้งบอกข้อดีข้อเสีย เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลในภาษา R language โดยใช้ Tree พร้อมยก code มาเป็นตัวอย่างสำหรับการ insert, update ข้อมูล , ค้นหา find, delete และอธิบายการทำงานสั้นๆ พร้อมทั้งบอกข้อดีข้อเสีย เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลในภาษา TypeScript โดยใช้ Tree พร้อมยก code มาเป็นตัวอย่างสำหรับการ insert, update ข้อมูล , ค้นหา find, delete และอธิบายการทำงานสั้นๆ พร้อมทั้งบอกข้อดีข้อเสีย เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลในภาษา Abap โดยใช้ Tree พร้อมยก code มาเป็นตัวอย่างสำหรับการ insert, update ข้อมูล , ค้นหา find, delete และอธิบายการทำงานสั้นๆ พร้อมทั้งบอกข้อดีข้อเสีย เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลในภาษา VBA โดยใช้ Tree พร้อมยก code มาเป็นตัวอย่างสำหรับการ insert, update ข้อมูล , ค้นหา find, delete และอธิบายการทำงานสั้นๆ พร้อมทั้งบอกข้อดีข้อเสีย เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลในภาษา Julia โดยใช้ Tree พร้อมยก code มาเป็นตัวอย่างสำหรับการ insert, update ข้อมูล , ค้นหา find, delete และอธิบายการทำงานสั้นๆ พร้อมทั้งบอกข้อดีข้อเสีย เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลในภาษา Haskell โดยใช้ Tree พร้อมยก code มาเป็นตัวอย่างสำหรับการ insert, update ข้อมูล , ค้นหา find, delete และอธิบายการทำงานสั้นๆ พร้อมทั้งบอกข้อดีข้อเสีย เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลในภาษา Groovy โดยใช้ Tree พร้อมยก code มาเป็นตัวอย่างสำหรับการ insert, update ข้อมูล , ค้นหา find, delete และอธิบายการทำงานสั้นๆ พร้อมทั้งบอกข้อดีข้อเสีย เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลแบบไดนามิคใน PHP ผ่าน Tree เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลแบบไดนามิคใน Next.js ผ่าน Tree เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลแบบไดนามิคใน Node.js ผ่าน Tree เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลแบบไดนามิคใน Fortran ผ่าน Tree เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลแบบไดนามิคใน Delphi Object Pascal ผ่าน Tree เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลแบบไดนามิคใน MATLAB ผ่าน Tree เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลแบบไดนามิคใน Swift ผ่าน Tree เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลแบบไดนามิคใน Kotlin ผ่าน Tree เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลแบบไดนามิคใน COBOL ผ่าน Tree เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลแบบไดนามิคใน Objective-C ผ่าน Tree เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลแบบไดนามิคใน Dart ผ่าน Tree เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลแบบไดนามิคใน Scala ผ่าน Tree เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลแบบไดนามิคใน R language ผ่าน Tree เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลแบบไดนามิคใน TypeScript ผ่าน Tree เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลแบบไดนามิคใน ABAP ผ่าน Tree เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลแบบไดนามิคใน VBA ผ่าน Tree** เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลแบบไดนามิคใน Julia ผ่าน Tree เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลแบบไดนามิคใน Haskell ผ่าน Tree เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลแบบไดนามิคใน Groovy ผ่าน Tree เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลแบบไดนามิคใน Ruby ผ่าน Tree

Tree ใน Data Structures - การปรับสมดุล AVL Tree

 

ในการพัฒนาโปรแกรมที่ซับซ้อน การใช้งานโครงสร้างข้อมูลที่มีประสิทธิภาพก็เป็นสิ่งสำคัญ หนึ่งในโครงสร้างข้อมูลที่นิยมใช้งานและมีความสำคัญคือ "Tree" ในบทความนี้ เราจะพูดถึง "AVL Tree" ซึ่งเป็น Balanced Binary Search Tree (BST) ประเภทหนึ่งที่มีประโยชน์ในการรักษาความสมดุลในความสูงของต้นไม้เพื่อเพิ่มประสิทธิภาพในกระบวนการค้นหา แทรก และลบข้อมูล

 

AVL Tree คืออะไร?

AVL Tree ถูกพัฒนาขึ้นในปี 1962 โดยนักคณิตศาสตร์ G. M. Adelson-Velsky และ E. M. Landis ซึ่งชื่อ AVL มาจากนามสกุลของพวกเขา AVL Tree นั้นเป็นการปรับปรุง Binary Search Tree (BST) เพื่อรักษาสมดุล ทำให้การปฏิบัติการต่างๆ เกิดขึ้นได้ในเวลา O(log n)

หนึ่งในคุณสมบัติเด่นของ AVL Tree คือ ที่กำหนดให้ "Height Balance" หรือความต่างของความสูงของ sub-trees ทางซ้ายและขวา ของโหนดใดๆ ต้องไม่เกิน 1 นี่คือปัจจัยที่ทำให้ AVL Tree สมดุลเสมอ

 

ทำไมต้องใช้ AVL Tree?

ใน BST ธรรมดา เมื่อมีการเพิ่มหรือลบข้อมูลหลายๆ ครั้ง โครงสร้างของต้นไม้อาจเอียงไปทางใดทางหนึ่งมากเกินไป ทำให้การค้นหาอาจใช้เวลามากขึ้นใกล้เคียง O(n) และเสียประสิทธิภาพ AVL Tree เข้ามาแก้ปัญหานี้ด้วยการปรับสมดุลให้ทุกครั้งที่มีการเปลี่ยนแปลงโครงสร้างการแทรกหรือลบข้อมูล

 

การปรับสมดุลของ AVL Tree

ในการรักษาสมดุลของ AVL Tree เราใช้การหมุน (Rotation) แบ่งออกเป็น 4 แบบคือ

1. Left Rotation: ใช้กับโหนดที่ Balance Factor คือ -2 และลูกขวาของมันมี Balance Factor -1 2. Right Rotation: ใช้กับโหนดที่ Balance Factor คือ 2 และลูกซ้ายของมันมี Balance Factor 1 3. Left-Right Rotation: ใช้เมื่อมีโหนดที่ Balance Factor คือ 2 แต่ลูกซ้ายของมันมี Balance Factor -1 4. Right-Left Rotation: ใช้เมื่อมีโหนดที่ Balance Factor คือ -2 แต่ลูกขวาของมันมี Balance Factor 1

เรามาดูตัวอย่างการหมุนและปรับสมดุล AVL Tree กันดีกว่า

 

ตัวอย่างการใช้งาน AVL Tree

ลองมาดูโค้ดสำหรับการทำการปรับสมดุล AVL Tree ในการแทรก (insert) ข้อมูลภาษา Python กัน


class Node:
    def __init__(self, key):
        self.left = None
        self.right = None
        self.height = 1
        self.key = key

class AVLTree:

    def insert(self, root, key):

        # Step 1: Perform normal BST insert
        if not root:
            return Node(key)
        elif key < root.key:
            root.left = self.insert(root.left, key)
        else:
            root.right = self.insert(root.right, key)

        # Step 2: Update height of current node
        root.height = 1 + max(self.getHeight(root.left), self.getHeight(root.right))

        # Step 3: Get the balance factor
        balance = self.getBalance(root)

        # Step 4: If the node is unbalanced, then try out the 4 cases
        # Left Left Case
        if balance > 1 and key < root.left.key:
            return self.rightRotate(root)

        # Right Right Case
        if balance < -1 and key > root.right.key:
            return self.leftRotate(root)

        # Left Right Case
        if balance > 1 and key > root.left.key:
            root.left = self.leftRotate(root.left)
            return self.rightRotate(root)

        # Right Left Case
        if balance < -1 and key < root.right.key:
            root.right = self.rightRotate(root.right)
            return self.leftRotate(root)

        return root

    def leftRotate(self, z):
        y = z.right
        T2 = y.left

        # Perform rotation
        y.left = z
        z.right = T2

        # Update heights
        z.height = 1 + max(self.getHeight(z.left), self.getHeight(z.right))
        y.height = 1 + max(self.getHeight(y.left), self.getHeight(y.right))

        # Return the new root
        return y

    def rightRotate(self, z):
        y = z.left
        T3 = y.right

        # Perform rotation
        y.right = z
        z.left = T3

        # Update heights
        z.height = 1 + max(self.getHeight(z.left), self.getHeight(z.right))
        y.height = 1 + max(self.getHeight(y.left), self.getHeight(y.right))

        # Return the new root
        return y

    def getHeight(self, root):
        if not root:
            return 0
        return root.height

    def getBalance(self, root):
        if not root:
            return 0
        return self.getHeight(root.left) - self.getHeight(root.right)

ในโค้ดตัวอย่างด้านบน การแทรกข้อมูลเข้าไปใน AVL Tree จะดำเนินการเหมือน BST ปกติก่อน จากนั้นจะปรับสมดุลด้วยการหมุนหากต้นไม้มีการเสียสมดุล

 

สรุป

AVL Tree เป็นโครงสร้างข้อมูลที่มีประโยชน์มากในหลายกรณีที่ต้องการความเร็วในการปฏิบัติการหลายๆ ชนิด เช่น การค้นหา แทรก และลบ เนื่องจากให้เวลาที่ใกล้เคียง O(log n) อยู่ตลอด การเรียนรู้ AVL Tree จึงเป็นเรื่องที่น่าสนใจสำหรับผู้ที่สนใจในการนำโครงสร้างข้อมูลไปปรับใช้ในงานโปรแกรมที่ต้องการความรวดเร็วและมีปริมาณข้อมูลจำนวนมาก

หากคุณสนใจเรียนรู้เพิ่มเติมเกี่ยวกับการโปรแกรมและโครงสร้างข้อมูลต่างๆ สามารถศึกษาเพิ่มเติมที่ Expert-Programming-Tutor (EPT) ซึ่งเป็นแหล่งการศึกษาเกี่ยวกับการเขียนโปรแกรมที่ครบวงจรและน่าสนใจ!

 

 

หมายเหตุ: ข้อมูลในบทความนี้อาจจะผิด โปรดตรวจสอบความถูกต้องของบทความอีกครั้งหนึ่ง บทความนี้ไม่สามารถนำไปใช้อ้างอิงใด ๆ ได้ ทาง EPT ไม่ขอยืนยันความถูกต้อง และไม่ขอรับผิดชอบต่อความเสียหายใดที่เกิดจากบทความชุดนี้ทั้งทางทรัพย์สิน ร่างกาย หรือจิตใจของผู้อ่านและผู้เกี่ยวข้อง

หากเจอข้อผิดพลาด หรือต้องการพูดคุย ติดต่อได้ที่ https://m.me/expert.Programming.Tutor/


Tag ที่น่าสนใจ: java c# vb.net python c c++ machine_learning web database oop cloud aws ios android


บทความนี้อาจจะมีที่ผิด กรุณาตรวจสอบก่อนใช้

หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor

ไม่อยากอ่าน Tutorial อยากมาเรียนเลยทำอย่างไร?

สมัครเรียน ONLINE ได้ทันทีที่ https://elearn.expert-programming-tutor.com

หรือติดต่อ

085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM

แผนที่ ที่ตั้งของอาคารของเรา

แผนผังการเรียนเขียนโปรแกรม

Link อื่นๆ

Allow sites to save and read cookie data.
Cookies are small pieces of data created by sites you visit. They make your online experience easier by saving browsing information. We use cookies to improve your experience on our website. By browsing this website, you agree to our use of cookies.

Copyright (c) 2013 expert-programming-tutor.com. All rights reserved. | 085-350-7540 | 084-88-00-255 | ntprintf@gmail.com

ติดต่อเราได้ที่

085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM
แผนที่ ที่ตั้งของอาคารของเรา