UPDATE: คำถามนี้เป็นเรื่องของบล็อกของฉันใน 8 มิถุนายน 2012 ขอบคุณสำหรับคำถามดีๆ!
คำถามที่ดี เราถกเถียงกันในประเด็นที่คุณยกมาเป็นเวลานาน
เราต้องการโครงสร้างข้อมูลที่มีลักษณะดังต่อไปนี้:
- ไม่เปลี่ยนรูป
- รูปแบบของต้นไม้
- การเข้าถึงโหนดหลักราคาถูกจากโหนดลูก
- เป็นไปได้ที่จะแมปจากโหนดในทรีกับอักขระที่ออฟเซ็ตในข้อความ
- หมั่น
ตามความคงอยู่ฉันหมายถึงความสามารถในการนำโหนดที่มีอยู่ส่วนใหญ่มาใช้ซ้ำในโครงสร้างเมื่อทำการแก้ไขบัฟเฟอร์ข้อความ เนื่องจากโหนดไม่เปลี่ยนรูปจึงไม่มีอุปสรรคในการนำกลับมาใช้ เราต้องการสิ่งนี้เพื่อประสิทธิภาพ เราไม่สามารถแยกวิเคราะห์ไฟล์ขนาดใหญ่ซ้ำได้ทุกครั้งที่คุณกดปุ่ม เราจำเป็นต้อง re-lex และแยกวิเคราะห์เฉพาะส่วนของต้นไม้ที่ได้รับผลกระทบจากการแก้ไข
ตอนนี้เมื่อคุณพยายามรวมทั้งห้าสิ่งเหล่านี้ไว้ในโครงสร้างข้อมูลเดียวคุณจะพบปัญหาทันที:
- คุณสร้างโหนดอย่างไรตั้งแต่แรก? พ่อแม่และเด็กทั้งคู่อ้างถึงกันและกันและไม่เปลี่ยนรูปดังนั้นอันไหนสร้างก่อน?
- สมมติว่าคุณจัดการเพื่อแก้ปัญหานั้น: คุณจะทำให้มันดื้อรั้นได้อย่างไร? คุณไม่สามารถใช้โหนดลูกซ้ำในพาเรนต์อื่นได้เนื่องจากจะเกี่ยวข้องกับการบอกเด็กว่ามีพาเรนต์ใหม่ แต่เด็กนั้นไม่เปลี่ยนรูป
- สมมติว่าคุณจัดการเพื่อแก้ปัญหานั้น: เมื่อคุณแทรกอักขระใหม่ลงในบัฟเฟอร์แก้ไขตำแหน่งที่แน่นอนของทุกโหนดที่แมปกับตำแหน่งหลังจากจุดนั้นเปลี่ยนไป สิ่งนี้ทำให้ยากมากที่จะสร้างโครงสร้างข้อมูลถาวรเนื่องจากการแก้ไขใด ๆ สามารถเปลี่ยนช่วงของโหนดส่วนใหญ่ได้!
แต่ในทีม Roslyn เรามักจะทำสิ่งที่เป็นไปไม่ได้ เราทำสิ่งที่เป็นไปไม่ได้จริง ๆ โดยการแยกต้นไม้สองต้น ทรี "สีเขียว" ไม่เปลี่ยนรูปถาวรไม่มีการอ้างอิงพาเรนต์สร้างขึ้น "จากล่างขึ้นบน" และทุกโหนดติดตามความกว้างแต่ไม่ใช่ตำแหน่งที่แน่นอนตำแหน่งที่แน่นอนเมื่อการแก้ไขเกิดขึ้นเราจะสร้างเฉพาะส่วนของต้นไม้สีเขียวที่ได้รับผลกระทบจากการแก้ไขซึ่งโดยทั่วไปจะเกี่ยวกับ O (log n) ของโหนดแยกวิเคราะห์ทั้งหมดในทรี
ต้นไม้ "สีแดง" เป็นซุ้มที่ไม่เปลี่ยนรูปซึ่งสร้างขึ้นรอบ ๆ ต้นไม้สีเขียว มันถูกสร้างขึ้น "จากบนลงล่าง" ตามความต้องการและทิ้งไปในทุกการแก้ไข คำนวณการอ้างอิงผู้ปกครองโดยการผลิตตามความต้องการเมื่อคุณลงมาตามต้นไม้จากด้านบนการผลิตพวกเขาเกี่ยวกับความต้องการในขณะที่คุณเดินผ่านต้นไม้จากด้านบนมันสร้างตำแหน่งที่แน่นอนโดยคำนวณจากความกว้างอีกครั้งเมื่อคุณลงมา
คุณผู้ใช้เท่านั้นที่เคยเห็นต้นไม้สีแดง ต้นไม้สีเขียวเป็นรายละเอียดการใช้งาน หากคุณมองเข้าไปในสถานะภายในของโหนดแยกวิเคราะห์คุณจะเห็นว่ามีการอ้างอิงไปยังโหนดแยกวิเคราะห์อื่นในประเภทอื่น นั่นคือโหนดต้นไม้สีเขียว
อนึ่งสิ่งเหล่านี้เรียกว่า "ต้นไม้สีแดง / สีเขียว" เนื่องจากเป็นสีของเครื่องหมายไวท์บอร์ดที่เราใช้ในการวาดโครงสร้างข้อมูลในการประชุมออกแบบ ไม่มีความหมายอื่นใดสำหรับสี
ข้อดีของกลยุทธ์นี้คือเราได้รับสิ่งที่ยอดเยี่ยมเหล่านั้นไม่ว่าจะไม่เปลี่ยนรูปการคงอยู่การอ้างอิงผู้ปกครองและอื่น ๆ ค่าใช้จ่ายคือระบบนี้มีความซับซ้อนและสามารถใช้หน่วยความจำได้มากหากส่วนหน้า "สีแดง" มีขนาดใหญ่ เรากำลังทำการทดลองเพื่อดูว่าเราสามารถลดค่าใช้จ่ายบางส่วนได้โดยไม่เสียประโยชน์หรือไม่