โครงสร้างข้อมูลที่ดีที่สุดสำหรับแผนผังต้นไม้คืออะไร


9

ฉันกำลังมองหาโครงสร้างข้อมูลซึ่งโดยพื้นฐานแล้วเป็นแผนผังของแผนที่ที่แผนที่ในแต่ละโหนดมีองค์ประกอบใหม่ ๆ รวมถึงองค์ประกอบในแผนที่ของโหนดแม่ โดยแผนที่ที่นี่ฉันหมายถึงแผนที่การเขียนโปรแกรมที่มีคีย์และค่าเช่น map ใน STL หรือ dict ใน python

ตัวอย่างเช่นอาจมีโหนดรูท:

root = {'car':1, 'boat':2}

และเด็ก 2 คนแต่ละคนเพิ่มองค์ประกอบไปยังแผนที่หลัก

child1 = {'car':1, 'boat':2, 'jet':35}
child2 = {'car':1, 'boat':2, 'scooter':-5}

ฉันต้องการให้พื้นที่มีประสิทธิภาพเท่าที่จะเป็นไปได้เช่นฉันไม่ต้องการเก็บสำเนาของแผนที่ที่เกิดขึ้นในแต่ละโหนด แต่การค้นหาจะยังคงเป็น O (log N), N เป็นจำนวนทั้งหมดของ องค์ประกอบที่โหนดไม่ใช่ต้นไม้ทั้งหมด

ฉันคิดว่าอาจจะมีฟังก์ชั่นแฮชอัจฉริยะที่ฉันอาจใช้กับสิ่งนี้ แต่ไม่สามารถคิดอะไรได้เลย

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


ดังนั้นแต่ละโหนดแทนแผนที่ที่ปรับแต่งแผนที่ที่เก็บไว้ใน parent?
Suresh Venkat

คุณหมายถึงแผนที่ในแง่คณิตศาสตร์หรือการทำแผนที่หรือไม่
Suresh Venkat

ฉันหมายถึงแผนที่ในแง่คณิตศาสตร์ / CS กดไลค์ในแผนที่ของ STL
phreeza

@Suresh: ดูเหมือนว่ามันไม่ใช่การปรับแต่ง หากฉันได้รับคำถามที่ถูกต้องโหนดลูกจะเพิ่มองค์ประกอบใหม่ให้กับแผนที่ของโหนดหลัก
Jukka Suomela

และเพื่อตอบคำถามแรกแต่ละโหนดจะปรับแต่งแผนที่ในแง่ที่ว่ามีการเพิ่มคู่คีย์ / ค่าเพิ่มเติม
phreeza

คำตอบ:


10

คุณไม่ได้พูดว่าการสืบค้นคืออะไร แต่ฉันจะถือว่าการสืบค้น () รับในโหนดและคีย์และต้องการค่าที่เกี่ยวข้อง (หรือเป็นโมฆะหากไม่มีค่าดังกล่าว) ในกรณีนี้ฉันคิดว่าโดยทั่วไปคุณไม่สามารถทำได้ดีกว่าการจัดเก็บแผนที่แยกต่างหากในทุกโหนด ลองพิจารณาตัวอย่างต้นไม้ caterpillar ที่แต่ละเส้นทางของโหนดมีหนึ่งโหนดเชื่อมต่อกับโหนดที่ถูกแยกออก (รวมเป็น 2n nodes) รูทที่ปลายด้านหนึ่งของเส้นทาง ทีนี้สมมุติว่าขนาดของจักรวาลสำหรับกุญแจคือ m สำหรับแต่ละโหนดที่แยกออก v และแต่ละคีย์ที่เป็นไปได้ m คีย์นั้นอาจมีอยู่หรือไม่มีอยู่ที่ v และทั้งสองจะสอดคล้องกับข้อ จำกัด ทรีย่อยของคุณ ดังนั้นมี2mn ความเป็นไปได้ที่ว่าแต่ละคีย์จะมีอยู่ที่แต่ละโหนดหรือไม่


5
แต่ตัวอย่างนี้ไม่แสดงว่าคุณต้องเก็บข้อมูลที่ซ้ำซ้อน (นั่นคือคุณต้องทำซ้ำรายการของโหนดรูทที่เด็กแต่ละคนเช่นกัน)!
Jukka Suomela

ฉันสับสน ในต้นไม้แห่งความลึก1 กับ n โหนดเป็นที่ชัดเจนว่าคุณไม่สามารถจัดเก็บ m การผูกเข้า o(m)ช่องว่าง ตัวอย่างของคุณแสดงอะไรอีกหรือไม่
Radu GRIGore

15

ก่อนอื่นฉันคิดว่าสิ่งที่คุณหมายถึงโดย "แผนที่" เป็น "พจนานุกรม" ใน TCS lingo ประการที่สองฉันไม่เข้าใจวลีที่ว่าO(logN)"เนื่องจากในพจนานุกรมการค้นหาใช้เวลา O (1) กับตารางแฮชต่างๆประการที่สามคุณไม่ได้ระบุว่าปัญหานั้นเป็นแบบคงที่หรือไดนามิก

ความซับซ้อนที่เหมาะสมที่สุดสำหรับปัญหานี้คือ Θ(การค้นหาก่อนหน้า) เช่น O(lglgN)ใช้ van Emde Boas สิ่งนี้จะเหมาะสมที่สุดถ้าคุณมีขนาดคำΘ(lgn); ดูhttp://people.csail.mit.edu/mip/papers/pred/pred.pdfสำหรับขอบเขตของรุ่นก่อนที่ดีที่สุด

วิธีที่เหมาะสมในการโจมตีปัญหาคือการสร้างตารางแฮชส่วนกลางหนึ่งตารางและจัดการกับลำดับชั้นแยกต่างหากสำหรับแต่ละคีย์ในตาราง สำหรับรหัสเดียวxเรารู้โหนดที่ปรากฏ พิจารณาการสำรวจเส้นทางตามลำดับของต้นไม้ โหนดที่xปรากฏกำหนดช่วงเวลาในลำดับนี้ เพื่อตรวจสอบว่าx อยู่ในตารางแฮชของบางโหนด vคุณต้องถามว่า vแทงส่วนใดก็ได้ตามที่กำหนดไว้ข้างต้น สิ่งนี้ทำได้ง่ายโดยการค้นหารุ่นก่อนซึ่งเราสร้างตารางตัวเลือกสำหรับจุดสิ้นสุดของช่วงเวลาทั้งหมด

สำหรับขอบเขตที่ต่ำกว่าโปรดทราบว่าแม้แต่คำถามการแทงหนึ่งคำถามก็ยังยากเท่ารุ่นก่อน เนื่องจากการอ้างอิงกระดาษด้านบนแสดงพฤติกรรมการหาผลรวมโดยตรงที่ดีที่สุดสำหรับการค้นหารุ่นก่อนหมายความว่าอัลกอริทึมที่อธิบายข้างต้นเหมาะสมที่สุดสำหรับการปันส่วนใด ๆ ระหว่างจำนวนโหนดและจำนวนปุ่มทั้งหมด

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