ตามคำขอนี่คือโครงสร้างที่ฉันพบหลังจากฉันกำหนดคำถาม:
แนวคิดพื้นฐานคือการใช้ต้นไม้ Scapegoat แบบเธรด พร้อมกับตัวชี้ไปยังค่าต่ำสุด (และสำหรับการวัดที่ดี, ค่าสูงสุดเช่นกัน) ทางเลือกที่ง่ายกว่าในการทำเกลียวคือการรักษาตัวชี้และผู้สืบทอดในทุกโหนด (ซึ่งเทียบเท่าได้ง่ายกว่า แต่มีค่าใช้จ่ายมากกว่า) ฉันจะเรียกมันว่ากองแพะรับบาปเพียงเพื่อให้ชื่อ
โครงสร้างพื้นฐานนี้ช่วยให้คุณดำเนินการเหล่านี้:
- ค้นหา: รับคีย์กลับชี้ไปยังโหนดที่สอดคล้องกันในเวลาO ( บันทึกn )
- แทรก: รับคีย์แทรกที่สำคัญในโครงสร้างที่กลับตัวชี้ไปยังโหนดว่าในเวลาO ( บันทึกn )
- บรรพบุรุษ / ทายาท: กำหนดตัวชี้กลับทายาทหรือบรรพบุรุษในเวลาO ( 1 )
- Get-Min / Max: ส่งกลับตัวชี้ไปที่ต่ำสุดหรือสูงสุด
ในการวิเคราะห์ต้นไม้ Scapegoat ค่าใช้จ่ายสมดุลของการลบจะถูกวิเคราะห์เป็นแต่การวิเคราะห์ให้ค่าใช้จ่ายสมดุลของO ( 1 ) (ซึ่งจะถูกละเว้นในกระดาษตามที่พวกเขานับO ( log n) )เวลาที่ใช้ในการค้นหาโหนดที่จะถูกลบ) ดังนั้นถ้าเรามีตัวชี้ไปยังโหนดเราสามารถลบมันในเวลาคงที่ (คุณสามารถทำได้ในเธรดการค้นหาแบบไบนารีเธรดในO ( 1 )เวลา) และรวมกับO ( 1 )ค่าใช้จ่ายในการสร้างสมดุลโอ (O ( บันทึกn )O ( 1 )O ( บันทึกn )O ( 1 )O(1)เวลาลบ:O(1)
- ลบ: กำหนดตัวชี้ลบโหนดในเวลาO(1)
รวมสิ่งนี้:
- สารสกัดจาก-Min / Max: ลบโหนดต่ำสุด / สูงสุดเวลาO(1)
คุณสามารถทำอะไรได้มากขึ้นด้วยพอยน์เตอร์: ตัวอย่างเช่นมันไม่ยากที่จะรักษาตัวชี้ไปยังค่ามัธยฐานหรือสถิติการสั่งซื้ออื่น ๆ ดังนั้นคุณสามารถรักษาพอยน์เตอร์ดังกล่าวให้คงที่หากคุณต้องการ
บางสิ่งอื่น ๆ :
- สร้าง: รับคีย์ในเรียงลำดับสร้างกองแพะรับบาปในO ( n )เวลาnO(n)
- Balance: ทำให้ต้นไม้มีความสมดุลดังนั้นจึงสร้างแผนภูมิการค้นหาแบบไบนารีที่มีความสมดุลอย่างสมบูรณ์แบบ (ลดค่าใช้จ่ายในการค้นหา) ในเวลา (คุณสามารถทำสิ่งนี้ให้คงที่ได้เร็วกว่ากระดาษที่เสนอโดยวิธีการ ชี้)O(n)
และสุดท้ายฉันก็ค่อนข้างมั่นใจว่าคุณสามารถรองรับการปฏิบัติการเหล่านี้ได้ แต่ฉันต้องคิดถึงสิ่งเหล่านี้ให้มากขึ้นก่อนที่จะรู้สิ่งนี้อย่างแน่นอน:
- แทรก-New-Min / Max: รับสำคัญที่มีขนาดเล็ก / ขนาดใหญ่กว่าปุ่มใด ๆ แล้วในโครงสร้างแทรกที่สำคัญในโครงสร้างที่กลับตัวชี้ไปยังโหนดว่าในเวลาO(1)