Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

2-3 Trees (ค้นหาและแทรก) ใน C/C++?


ต้นไม้ 2-3 ต้นถูกกำหนดให้เป็นโครงสร้างข้อมูลต้นไม้ โดยที่ทุกโหนดที่มีลูก (โหนดภายใน) มีลูกสองคน (2 โหนด) เช่นเดียวกับองค์ประกอบข้อมูลหนึ่งองค์ประกอบหรือลูกสามคน (3 โหนด) รวมถึงสองข้อมูล องค์ประกอบ

2-3 Trees (ค้นหาและแทรก) ใน C/C++?

คำจำกัดความ

เราเรียกว่าโหนดภายในเป็น 2 โหนดหากมีองค์ประกอบข้อมูลหนึ่งองค์ประกอบและลูกสองคน

เราเรียกโหนดภายในว่าเป็นโหนด 3 โหนดหากมีองค์ประกอบข้อมูล 2 รายการและโหนดลูก 3 รายการ

เราเรียกสิ่งนั้นว่า T เป็นต้นไม้ 2-3 ต้นก็ต่อเมื่อข้อความต่อไปนี้ตรงกับข้อใดข้อหนึ่ง -

  • T ว่างเปล่าหรือว่างเปล่า กล่าวอีกนัยหนึ่ง T ไม่มีโหนดใด ๆ

  • T คือ 2 โหนดที่ติดตั้งองค์ประกอบข้อมูล a ถ้า T ทิ้งลูก L และลูกขวา R เราก็สรุป

  • L และ R ถือเป็นต้นไม้ที่มีความสูงเท่ากัน 2-3 ต้น

  • a สูงกว่าแต่ละองค์ประกอบใน L; และ

  • a น้อยกว่าหรือเท่ากับแต่ละองค์ประกอบข้อมูลใน R.

  • T คือโหนด 3 โหนดที่มีองค์ประกอบข้อมูล a และ b โดยที่ a น้อยกว่า b ถ้า T ทิ้งลูก L ลูกกลาง M และลูกขวา R เราก็สรุป

  • L, M และ R ถือเป็นต้นไม้ 2-3 ต้นที่มีความสูงเท่ากัน

  • a สูงกว่าองค์ประกอบข้อมูลแต่ละองค์ประกอบใน L และเล็กกว่าหรือเท่ากับองค์ประกอบข้อมูลแต่ละรายการใน M และ

  • b สูงกว่าองค์ประกอบข้อมูลแต่ละองค์ประกอบใน M และเล็กกว่าหรือเท่ากับองค์ประกอบข้อมูลแต่ละรายการใน R

คุณสมบัติ

  • โหนดภายในทั้งหมดถือเป็น 2 โหนดหรือ 3 โหนด

  • ใบทั้งหมดอยู่ในระดับเดียวกัน

  • ข้อมูลทั้งหมดจะได้รับการดูแลหรือจัดเรียงลำดับ

ปฏิบัติการ

กำลังค้นหา

การค้นหารายการในทรี 2-3 เหมือนกับการค้นหารายการในทรีการค้นหาแบบไบนารี เนื่องจากองค์ประกอบข้อมูลในแต่ละโหนดได้รับการปฏิบัติตามลำดับ ฟังก์ชันการค้นหาจะถูกนำไปยังทรีย่อยที่ถูกต้องและสุดท้ายไปยังโหนดที่ถูกต้องซึ่งประกอบด้วยรายการ

  • ให้ T เป็นต้นไม้ 2-3 ต้น และ d เป็นองค์ประกอบข้อมูลที่เราต้องการค้นหา หาก T ว่างเปล่า แสดงว่า d ไม่อยู่ใน T และเราจะถูกดำเนินการ

  • ให้ r เป็นรากของ T.

  • ให้ r เป็นใบไม้ ถ้า d ไม่อยู่ใน r ดังนั้น d จึงไม่อยู่ใน T มิฉะนั้น d อยู่ใน T โดยเฉพาะอย่างยิ่ง d สามารถพบได้ที่โหนดปลายสุด เราไม่ต้องการขั้นตอนเพิ่มเติมและเราจะดำเนินการ

  • สมมติว่า r ถูกปฏิบัติเป็น 2 โหนดโดยมี L ลูกด้านซ้ายและ R ลูกด้านขวา ให้ e ถูกถือเป็นองค์ประกอบข้อมูลใน r

มีสามกรณี -

  • หาก d เท่ากับ e เราพบ d ใน T แล้วจึงดำเนินการ

  • ถ้า d น้อยกว่า e ให้ตั้งค่า T เป็น L ซึ่งตามคำจำกัดความคือ 2-3 tree แล้วกลับไปที่ขั้นตอนที่ 2

  • หาก d มากกว่า e ให้ตั้งค่า T เป็น R แล้วกลับไปที่ขั้นตอนที่ 2

  • ให้ r เป็น 3 โหนดที่มี L ลูกซ้าย ลูกกลาง M และลูกขวา R ให้ a และ b เป็นองค์ประกอบข้อมูลสององค์ประกอบของ r โดยที่ a

    • ถ้า d เท่ากับ a หรือ b ดังนั้น d อยู่ใน T และเราจะดำเนินการ

    • หาก d น้อยกว่า a ให้ตั้งค่า T เป็น L แล้วกลับไปที่ขั้นตอนที่ 2

    • หาก ais น้อยกว่า d และ d น้อยกว่า b ให้ตั้งค่า T เป็น M และกลับไปที่ขั้นตอนที่ 2

    • ถ้า d มากกว่า b ให้ตั้งค่า T เป็น R แล้วย้อนกลับไปยังขั้นตอนที่ 2

การแทรก

การแทรกทำได้โดยการค้นหาตำแหน่งที่ถูกต้องของคีย์และต่อท้ายหรือเพิ่มเข้าไปที่นั่น หากโหนดกลายเป็น 4 โหนด โหนดจะถูกแบ่งออกเป็นสองโหนด 2 โหนด และคีย์กลางจะถูกย้ายขึ้นไปที่พาเรนต์ จากนั้นพาเรนต์อาจกลายเป็น 4 โหนด ซึ่งในกรณีนี้จะถูกแบ่งด้วย เผยแพร่คีย์ไปยังพาเรนต์ของตัวเอง กระบวนการนี้จะเกิดขึ้นซ้ำๆ จนกว่าเราจะไปถึงพาเรนต์ที่มี 2 โหนด และไม่จำเป็นต้องแบ่งออก หรือเมื่อเราไปถึงรูท ซึ่งในกรณีนี้ เราจะนำองค์ประกอบที่เผยแพร่ไปใช้เพื่อสร้างรูทใหม่ที่มี 2 โหนด . ด้วยความช่วยเหลือของอัลกอริธึมนี้ จำนวนการดำเนินการที่ต้องทำเป็นสัดส่วนกับความสูงของต้นไม้ ดังนั้นลอการิทึมเนื่องจากต้นไม้มีความสมดุลอย่างสมบูรณ์ กระบวนการนี้ทำให้มั่นใจได้ว่าผลลัพธ์จะเหมือนต้นไม้ 2-3 ต้น:โดยเฉพาะอย่างยิ่งใบทั้งหมดยังคงอยู่ที่ระดับความลึกเท่ากัน

แผนภาพด้านล่างอธิบายหรือแสดงกรณีที่เป็นไปได้ของกระบวนการนี้

2-3 Trees (ค้นหาและแทรก) ใน C/C++?


การแทรกตัวเลขในทรี 2-3 อย่างเป็นไปได้ 3 กรณี