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

ต้นไม้ AA ใน C/C++?


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

ต้นไม้ AA ใน C/C++?


ตรงกันข้ามกับต้นไม้สีแดง-ดำ ในทางกลับกัน ต้นไม้ AA ต้องการเพียงสมมุติหรือพิจารณาสองรูปร่างเนื่องจากข้อกำหนดที่เข้มงวดซึ่งมีเพียงลิงก์ที่ถูกต้องเท่านั้นที่สามารถเป็นสีแดงได้ -

ต้นไม้ AA ใน C/C++?


การหมุนที่สมดุล

ในขณะที่ทรีสีแดง-ดำต้องการข้อมูลเมตาที่สมดุลหนึ่งบิตต่อโหนด (สี) ต้นไม้ AA ต้องการบิตข้อมูลเมตา O(log(N)) ต่อโหนด ในรูปแบบของ "ระดับ" ของจำนวนเต็ม ค่าคงที่ด้านล่างมีไว้สำหรับต้นไม้ AA -

  • ระดับของโหนดปลายสุดทุกอันถือเป็นหนึ่งเดียว

  • ระดับของลูกทางซ้ายทุกคนนั้นเล็กกว่าระดับผู้ปกครองเพียงหนึ่งระดับเท่านั้น

  • ระดับของเด็กที่ถูกต้องทุกคนจะเท่ากับหรือน้อยกว่าระดับของผู้ปกครอง

  • ระดับของหลานที่ถูกต้องทุกคนนั้นน้อยกว่าระดับของปู่ย่าตายายอย่างเคร่งครัด

  • ทุกโหนดที่มีระดับที่สูงกว่าหนึ่งมีลูกสองคน

การปรับสมดุลต้นไม้ AA ใหม่เป็นขั้นตอนง่ายกว่าหรือง่ายกว่าการปรับสมดุลต้นไม้สีแดง-ดำ

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

ฟังก์ชันเอียงคือ

อินพุต
   input: An AA tree that needs to be rebalanced is represented by a node, t.
   output: The rebalanced AA tree is represented by another node.
if nil(t) then
return nil
else if nil(left(t)) then
return t
else if level(left(t)) == level(t) then
   Exchange the pointers of horizontal left links.
   l = left(t)
left(t) := right(l)
right(l) := t
return l
else
return t
end if
end function

ต้นไม้ AA ใน C/C++?


การแบ่งฟังก์ชันคือ

อินพุต
   input: An AA tree that needs to be rebalanced is represented by a node, t.
   output: The rebalanced AA tree is represented by another node.
if nil(t) then
return nil
else if nil(right(t)) or nil(right(right(t))) then
return t
else if level(t) == level(right(right(t))) then
We have two horizontal right links. The middle node is taken, elevate it, and return it.
      r = right(t)
right(t) := left(r)
left(r) := t
level(r) := level(r) + 1
return r
else
return t
end if
end function

ต้นไม้ AA ใน C/C++?

แยก -