ต้นไม้ AVL และ Red black มีความสมดุลในตัวเองยกเว้นสีแดงและสีดำในโหนด อะไรคือเหตุผลหลักในการเลือกต้นไม้สีแดงดำแทนต้นไม้ AVL? ต้นไม้ดำแดงใช้งานอะไรได้บ้าง?
ต้นไม้ AVL และ Red black มีความสมดุลในตัวเองยกเว้นสีแดงและสีดำในโหนด อะไรคือเหตุผลหลักในการเลือกต้นไม้สีแดงดำแทนต้นไม้ AVL? ต้นไม้ดำแดงใช้งานอะไรได้บ้าง?
คำตอบ:
อะไรคือเหตุผลหลักในการเลือกต้นไม้สีแดงดำแทนต้นไม้ AVL?
ทั้งต้นแดงดำและต้น AVLมีใช้กันมากที่สุดต้นไม้ค้นหาแบบทวิภาคที่สมดุลO(logN) time
และพวกเขาสนับสนุนการแทรกการลบและการมองขึ้นในการรับประกัน อย่างไรก็ตามมีจุดเปรียบเทียบระหว่างสองสิ่งต่อไปนี้:
O(N)
พื้นที่เพิ่ม อย่างไรก็ตามหากเรารู้ว่าคีย์ที่จะใส่ในทรีจะมีค่ามากกว่าศูนย์เสมอเราสามารถใช้บิตเครื่องหมายของคีย์เพื่อเก็บข้อมูลสีของต้นไม้สีแดงดำได้ ดังนั้นในกรณีเช่นนี้ต้นไม้สีแดง - ดำจึงไม่ต้องใช้พื้นที่เพิ่มต้นไม้ดำแดงใช้อะไรได้บ้าง?
ต้นไม้สีแดงดำมีวัตถุประสงค์ทั่วไปมากกว่า พวกเขาทำได้ค่อนข้างดีในการเพิ่มลบและค้นหา แต่ต้นไม้ AVL มีการค้นหาที่เร็วกว่าโดยมีค่าใช้จ่ายในการเพิ่ม / ลบที่ช้าลง ต้นไม้สีแดง - ดำใช้ในสิ่งต่อไปนี้:
java.util.TreeMap
,java.util.TreeSet
In general, the rotations for an AVL tree are harder to implement and debug than that for a Red-Black tree.
ไม่ใช่ความจริง.
std:: map
และเพื่อน ๆ ใช้โครงสร้างใด ๆ โดยเฉพาะ เหลือเพียงการใช้งานแม้ว่า libstdc ++ และ Dinkumware อย่างน้อยก็ใช้ต้นไม้สีแดงดำและดูเหมือนว่าคุณจะถูกต้องในทางปฏิบัติ
ลองอ่านเรื่องนี้ บทความนี้
มีข้อมูลเชิงลึกที่ดีเกี่ยวกับความแตกต่างความคล้ายคลึงประสิทธิภาพและอื่น ๆ
นี่คือคำพูดจากบทความ:
RB-Trees เป็นเช่นเดียวกับต้นไม้ AVL ที่ปรับสมดุลในตัวเอง ทั้งสองให้ประสิทธิภาพการค้นหาและการแทรก O (log n)
ความแตกต่างคือ RB-Trees รับประกันการหมุน O (1) ต่อการใช้งานเม็ดมีด นั่นคือสิ่งที่คุ้มค่ากับประสิทธิภาพในการใช้งานจริง
แบบง่าย RB-Trees ได้เปรียบนี้จากการมีแนวคิดเป็นต้นไม้ 2-3 ต้นโดยไม่ต้องแบกรับโครงสร้างโหนดแบบไดนามิก RB-Trees ทางกายภาพถูกนำไปใช้เป็นต้นไม้ไบนารีธงสีแดง / ดำจำลองพฤติกรรม 2-3 อย่าง
เท่าที่ความเข้าใจของฉันไปต้น AVL และต้นไม้ RB นั้นไม่ไกลกันมากในแง่ของประสิทธิภาพ ต้นไม้ RB เป็นเพียงตัวแปรของ B-tree และการปรับสมดุลจะถูกนำไปใช้แตกต่างจากต้นไม้ AVL
ความเข้าใจของเราเกี่ยวกับความแตกต่างในประสิทธิภาพได้ดีขึ้นในช่วงหลายปีที่ผ่านมาและตอนนี้เหตุผลหลักที่ต้องใช้ต้นไม้สีแดงดำบน AVL คือไม่สามารถเข้าถึงการใช้งาน AVL ที่ดีได้เนื่องจากพบได้น้อยกว่าเล็กน้อยบางทีอาจเป็นเพราะไม่ครอบคลุมใน CLRS
ต้นไม้ทั้งสองได้รับการพิจารณาในขณะนี้รูปแบบของต้นไม้ยศสมดุลแต่ต้นไม้สีแดงสีดำมีอย่างต่อเนื่องช้าลงโดยประมาณ 20% ในการทดสอบในโลกแห่งความจริง หรือแม้กระทั่ง 30-40% ช้าเมื่อข้อมูลตามลำดับจะถูกแทรก
ดังนั้นคนที่ศึกษาต้นไม้สีแดงดำ แต่ไม่ใช่ต้นไม้ AVL มักจะเลือกต้นไม้สีแดงดำ การใช้หลักสำหรับต้นไม้สีแดงสีดำมีรายละเอียดในรายการวิกิพีเดียสำหรับพวกเขา
คำตอบอื่น ๆ สรุปข้อดีข้อเสียของต้นไม้ RB และ AVL ได้ดี แต่ฉันพบว่าความแตกต่างนี้น่าสนใจเป็นพิเศษ:
ต้นไม้ AVL ไม่รองรับต้นทุนการอัปเดตที่ตัดจำหน่ายคงที่[แต่ต้นไม้สีแดง - ดำทำ]
ที่มา: Mehlhorn & Sanders (2008) (หัวข้อ 7.4)
ดังนั้นในขณะที่ทั้ง RB และ AVL ทรีรับประกัน O (log (N)) เวลาที่เลวร้ายที่สุดสำหรับการค้นหาแทรกและลบการกู้คืนคุณสมบัติ AVL / RB หลังจากแทรกหรือลบโหนดสามารถทำได้ใน O (1) เวลาที่ตัดจำหน่ายสำหรับ ต้นไม้สีแดงดำ
โดยทั่วไปโปรแกรมเมอร์ไม่ชอบที่จะจัดสรรหน่วยความจำแบบไดนามิก ปัญหาเกี่ยวกับต้นไม้ avl คือสำหรับองค์ประกอบ "n" คุณต้องมีอย่างน้อย log2 (log2 (n)) ... (height-> log2 (n)) บิตเพื่อเก็บความสูงของต้นไม้! ดังนั้นเมื่อคุณจัดการข้อมูลมหาศาลคุณจึงไม่สามารถแน่ใจได้ว่าจะจัดสรรกี่บิตสำหรับการจัดเก็บความสูงในแต่ละโหนด
ตัวอย่างเช่นถ้าคุณใช้ int 4 ไบต์ (32 บิต) เพื่อจัดเก็บความสูง ความสูงสูงสุดคือ: 2 ^ 32 และด้วยเหตุนี้จำนวนองค์ประกอบสูงสุดที่คุณสามารถจัดเก็บในต้นไม้ได้คือ 2 ^ (2 ^ 32) - (ดูเหมือนจะใหญ่มาก แต่ในยุคนี้ของข้อมูลไม่มีอะไรใหญ่เกินไปฉันเดา) และด้วยเหตุนี้หากคุณยิงเกินขีด จำกัด นี้คุณจะต้องจัดสรรพื้นที่เพิ่มเติมสำหรับการจัดเก็บความสูงแบบไดนามิก
นี่คือคำตอบที่อาจารย์ในมหาวิทยาลัยของฉันแนะนำซึ่งดูสมเหตุสมผลสำหรับฉัน! หวังว่าฉันจะเข้าใจ
การแก้ไข: ต้นไม้ AVL มีความสมดุลมากกว่าเมื่อเทียบกับ Red Black Trees แต่อาจทำให้เกิดการหมุนมากขึ้นระหว่างการแทรกและการลบ ดังนั้นหากแอปพลิเคชันของคุณเกี่ยวข้องกับการแทรกและการลบบ่อยครั้งต้นไม้สีแดงดำควรเป็นที่ต้องการ และหากการแทรกและการลบมีความถี่น้อยลงและการค้นหามีการดำเนินการบ่อยกว่าควรเลือกต้นไม้ AVL เหนือต้นไม้สีแดงดำ - แหล่งที่มา GEEKSFORGEEKS.ORG
you need need atleast log2(log2(n))...(height->log2(n)) bits to store the height of [an AVL] tree
ฉันไม่ต้องการความสูงของโหนดใด ๆ ในต้นไม้ AVL เพื่อใช้งาน คุณต้องการข้อมูลเพิ่มเติมหนึ่งบิตสำหรับแต่ละโหนด ( ฉันคือคนที่ยิ่งใหญ่ที่สุด (พี่น้องที่มีต้นไม้ย่อยสูงสุด))); สะดวกกว่าเช่นเดียวกับแบบธรรมดาที่จะมีบิตพิเศษสองตัว (เด็กสูงกว่าสำหรับซ้ายและขวา) ตามที่ AV & L. นำเสนอ
การปรับสมดุลของต้นไม้ AVL ควรเป็นไปตามคุณสมบัติด้านล่าง (อ้างอิงวิกิ - ทรี AVL )
ในแผนภูมิ AVL ความสูงของต้นไม้ย่อยสองลูกของโหนดใด ๆ จะแตกต่างกันอย่างมาก หากเมื่อใดก็ตามที่มีความแตกต่างกันมากกว่าหนึ่งรายการจะทำการปรับสมดุลใหม่เพื่อกู้คืนคุณสมบัติ
ดังนั้นนี่จึงหมายความว่าความสูงโดยรวมของต้นไม้ AVL ไม่สามารถทำให้บ้าได้เช่นการค้นหาจะดีกว่าด้วย AVL Trees และเนื่องจากต้องมีการดำเนินการเพิ่มเติม (การหมุน) เพื่อไม่ให้ความสูงมากไปการดำเนินการปรับเปลี่ยนต้นไม้อาจมีราคาแพงเล็กน้อย