การรักษาต้นไม้ที่ทอดข้ามที่สมดุลของกราฟที่ไม่มีทิศทางเพิ่มขึ้น


19

ฉันกำลังมองหาวิธีที่จะรักษาต้นไม้ที่ทอดข้ามค่อนข้างสมดุลของกราฟในขณะที่ฉันเพิ่มโหนด / ขอบใหม่ให้กับกราฟ

ฉันมีกราฟที่ไม่มีทิศทางซึ่งเริ่มต้นเป็นโหนดเดียวคือ "รูท"

ในแต่ละขั้นตอนฉันเพิ่มกราฟทั้งโหนดใหม่และขอบเชื่อมต่อกับกราฟหรือเพียงแค่ขอบใหม่เชื่อมต่อสองโหนดเก่า ในขณะที่ฉันเติบโตกราฟฉันคงต้นไม้ที่ทอดไว้ ส่วนใหญ่แล้วนี่หมายความว่าเมื่อฉันเพิ่มโหนดและขอบใหม่ฉันตั้งค่าโหนดใหม่ให้เป็นลูกของโหนดเก่าที่มันเชื่อมต่อกับ

ฉันไม่สามารถควบคุมลำดับที่มีการเพิ่มโหนดใหม่ดังนั้นอัลกอริทึมการสร้างต้นไม้ด้านบนสามารถนำไปสู่ต้นไม้ที่ทอดได้อย่างสมดุล

ไม่มีใครรู้เกี่ยวกับการวิเคราะห์พฤติกรรมออนไลน์ที่จะทำให้ต้นไม้ที่ทอด "ค่อนข้างสมดุล" ในขณะที่ลดจำนวนงานที่ทำในการทำทรีใหม่หรือไม่ ฉันสามารถควบคุมโครงสร้างต้นไม้ได้อย่างสมบูรณ์ สิ่งที่ฉันไม่ควบคุมคือการเชื่อมต่อกราฟหรือลำดับที่เพิ่มโหนดใหม่

โปรดทราบว่าคำตอบมาตรฐานของ Google สำหรับคำเช่น "สมดุล" "การขยาย" และ "ต้นไม้" ดูเหมือนจะเป็นต้นไม้ไบนารีและต้นไม้ B ซึ่งไม่มีผลบังคับใช้ โหนดกราฟของฉันสามารถมีจำนวนเพื่อนบ้านได้ดังนั้นโหนดต้นไม้สามารถมีจำนวนเด็ก ๆ ได้ไม่ใช่ 2 เหมือนต้นไม้ไบนารี B-trees รักษาสมดุลโดยการเปลี่ยนรายการ adjacency ของพวกเขาและฉันไม่สามารถเปลี่ยนการเชื่อมต่อกราฟ


3
บางทีมันอาจช่วยได้ถ้าคุณมีความเฉพาะเจาะจงมากขึ้นเกี่ยวกับสิ่งที่ต้นไม้ในอุดมคติของคุณที่สมดุลของกราฟคงที่ ต้นไม้ BFS เป็นตัวเลือกที่ดีโดยอัตโนมัติในฐานะต้นไม้ที่มีความสมดุลหรือไม่ (จะตื้นที่สุดเท่าที่จะเป็นไปได้ถ้าคุณเลือกรูทที่ถูกต้อง คุณต้องการจำนวนโหนดในทรีย่อยแต่ละตัวที่เล็กกว่าโดยปัจจัยคงที่มากกว่าจำนวนโหนดที่ผู้ปกครองทุกที่ในต้นไม้และถ้าเป็นเช่นนั้นคุณจะทำอย่างไรกับกราฟที่ไม่มีต้นไม้เช่นนั้น?
David Eppstein

ต้นไม้ BFS จะเป็นต้นไม้ทอดที่เหมาะสมที่สุดหากฉันใช้งานออฟไลน์ด้วยกราฟทั้งหมดที่ได้รับในครั้งเดียว ไม่จำเป็นต้องมีจำนวนโหนดในทรีย่อยแต่ละอันให้เล็กลงด้วยค่าคงที่ที่มากกว่าจำนวนโหนดในพาเรนต์
SuperElectric

คุณได้ตรวจสอบต้นไม้ยอดนิยมแล้วหรือยัง? en.wikipedia.org/wiki/Top_tree
Peer Sommerlund

คำตอบ:


4

ทุกครั้งที่คุณเพิ่มจุดสุดยอดใหม่ด้วยขอบคุณไม่มีตัวเลือก ทุกครั้งที่คุณเพิ่มขอบใหม่หากระยะทางปัจจุบันไปยังรูทใหญ่กว่าระยะทางผ่านขอบใหม่คุณจะลบขอบเก่าในเส้นทางที่สั้นที่สุดเก่าและเพิ่มใหม่ มิฉะนั้นคุณเพียง แต่ทำให้ต้นไม้ไม่เปลี่ยนแปลง ฉันคิดว่าวิธีนี้คุณจะได้สิ่งที่คล้ายกับต้นไม้ BFS ในแง่ที่ว่าระดับของต้นไม้นั้นจะมีจุดยอดเดียวกันและระยะทางจากจุดยอดถึงรากจะเหมือนกับระยะทางในต้นไม้ BFS (และใน กราฟ) แต่ฉันไม่รู้ว่ามันเพียงพอที่จะตอบสนองเงื่อนไข


2

ฉันลงเอยด้วยการทำสิ่งต่อไปนี้:

คำตอบของ Vinicius Santos เป็นส่วนแรกของมัน ในขณะที่เขาพูดว่าที่เฟรมใดฉันจะเพิ่มโหนดใหม่และขอบแม่ลูกเชื่อมต่อกับมันหรือเพียงแค่เพิ่มข้ามขอบระหว่างสองโหนดที่มีอยู่ ขอบแม่ลูกไม่ให้โอกาสในการเปลี่ยนโครงสร้างของต้นไม้เพียง แต่ทำข้ามขอบ พิจารณาเพิ่ม E ข้ามขอบระหว่างโหนด A และ B โดยที่ B มีความลึกของต้นไม้มากขึ้น ถ้า (A.depth + 1) <B.depth เราสามารถลด B.depth ได้โดยทำให้เป็นลูกของ A

เมื่อลดความลึกของ B ลงเราจะต้องตรวจสอบเพื่อนบ้านของ B เพื่อดูว่าพวกเขาอาจลดความลึกลงโดยการเป็นลูกของ B หรือไม่ดังนั้นเราจึงทำการสำรวจเส้นทางแรกที่กว้างจาก B ซึ่งเคลื่อนที่ข้ามขอบจาก X ถึง Y ถ้า X ความลึก + 1 <Y.depth และตั้งค่า Y ให้เป็นลูกของ X

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.