มีโครงสร้างข้อมูลสำหรับการจัดการรายการด่วนและแบบสอบถามคำสั่งซื้อหรือไม่


9

เรามีชุด, , ของรายการขององค์ประกอบจากชุด\} องค์ประกอบจากแต่ละปรากฏในรายการเดียวในLฉันกำลังมองหาโครงสร้างข้อมูลที่สามารถทำการปรับปรุงต่อไปนี้:LN={1,2,3,...,n}NL

  1. concat(x,y) : เชื่อมต่อรายการที่มีเข้าท้ายรายการที่มีyx

  2. split(x) : แยกรายการที่มีโดยตรงหลังxx

นอกจากนี้ยังต้องดำเนินการค้นหาต่อไปนี้:

  1. follows(x,y) : ผลตอบแทนถ้าและอยู่ในรายการเดียวกันและมาหลังจาก (แต่ไม่จำเป็นต้องอยู่ติดกับ )truexyyxx

  2. first(x) : ส่งคืนองค์ประกอบแรกของรายการที่มีx

  3. next(x) : ส่งคืนองค์ประกอบถัดไปหลังจากในรายการที่มีxx

ผมมีอยู่แล้วมากับโครงสร้างข้อมูลที่มีประสิทธิภาพในการปรับปรุงเหล่านี้และแบบสอบถามในเวลา ฉันสนใจเป็นส่วนใหญ่ว่ามีโครงสร้างข้อมูลที่สามารถทำได้หรือไม่ (หวังว่าจะเร็วกว่านี้)O(lg2(n))O(lg(n))

การสร้างแรงจูงใจ: ป่าที่ถูกหยั่งรากจะถูกแสดงด้วยชุดรายการสองชุดและอนุญาตให้คำนวณการเข้าถึงได้ง่ายในป่าดังกล่าว ฉันต้องการดูว่ามีอะไรอีกบ้างที่พวกเขาสามารถใช้งานได้และหากทั้งหมดนี้เป็นที่รู้จักกันแล้ว

คำตอบ:


11

เก็บจำนวนเต็มของคุณในรายการข้าม รายการข้ามปกติมีการเรียงลำดับโดยคีย์ แต่เราจะใช้เพื่อเป็นตัวแทนของลำดับ นอกจากนี้บำรุงรักษาอาร์เรย์ของพอยน์เตอร์ขนาดn. แต่ละองค์ประกอบของอาร์เรย์ควรชี้ไปที่โหนดในรายการข้าม ฉันเชื่อว่านี่รองรับnอีxเสื้อ ใน O(1) และการดำเนินการอื่น ๆ ทั้งหมดใน O(LGn).

โดยเฉพาะ:

  • โอnaเสื้อไอเอ็นจีหรือ sพีล.ผมเสื้อการข้ามทั้งสองรายการใช้เวลา O(LGn) เวลาจึงเป็นโมฆะมากที่สุด O(LGn) ชี้
  • nอีxเสื้อ เพียงแค่ติดตามตัวชี้ไปข้างหน้าที่ระดับลีฟ O(1) เวลา.
  • ผมRsเสื้อ ใช้เวลา O(LGn)เวลา: ติดตามตัวชี้จนกว่าคุณจะติดค้างจากนั้นทำตามตัวชี้ซ้าย เมื่อคุณไม่สามารถติดตามตัวชี้ซ้ายที่เหลืออยู่คุณจะอยู่ที่ตัวชี้หัวของรายการข้ามของคุณ ตามพอยน์เตอร์ชี้ไปที่ใบไม้จากนั้นจึงเลื่อนตัวชี้ไปข้างหน้าหนึ่งอัน นี่เป็นองค์ประกอบแรกในรายการ
  • fโอล.ล.โอWsค่อนข้างยุ่งยาก ดำเนินการต่อในผมRsเสื้อ สำหรับ Yแต่บันทึกรายการค่าที่คุณค้างไว้ (นั่นคือที่ซึ่งคุณไม่สามารถติดตามตัวชี้ได้อีกต่อไป) เราจะเรียกรายการนี้ว่า "บันทึก" ทำเช่นเดียวกันสำหรับxแต่ทำตามคำแนะนำที่ถูกต้องเมื่อคุณติดไม่ออก ถ้าx แจ๋ว Yร่องรอยของพวกเขาจะตัดกัน ร่องรอยมีขนาดO(LGn). หากแต่ละองค์ประกอบในการติดตามมีการเพิ่มความคิดเห็นในระดับที่ติดอยู่เราสามารถตรวจสอบการตัดกันได้ทันเวลาO(LGn).

nอีxเสื้อ เป็นกรณีที่เลวร้ายที่สุด O(1)อื่น ๆ ทั้งหมดคือ O(LGn) มีโอกาสสูง พวกเขาสามารถทำกรณีที่เลวร้ายที่สุดโดยใช้รายการข้ามกำหนดขึ้น

ฉันคิด โอnaเสื้อ สามารถที่จะทำ O(LGLGn)โดยใช้ต้นไม้ที่เชื่อมโยงกับใบไม้ (2,5) ต้นและเพิ่มกระดูกสันหลัง สำหรับเคล็ดลับการบูตสแตรปให้ดูที่ "การทำงานที่เป็นตัวแทนอย่างแท้จริงของรายการที่จัดเรียงแบบ catenable " โดย Kaplan และ Tarjan


เย็น. ฉันกำลังคิดเกี่ยวกับรายการข้าม แต่ไม่สามารถดูวิธีการติดตามได้โดยไม่มีค่าคีย์ที่เกี่ยวข้อง
Sasho Nikolov

มันเยี่ยมมาก ฉันเห็นวิธีการอัปเดตทั้งหมดที่กำหนดไว้O(lg(n)), สิ่งไหนดี. ฉันจะต้องอ่านต่อไปเพื่อทำความเข้าใจ O (lg lg (n)) ขอบคุณสำหรับการโพสต์ @jbapple
bbejot

1

บรรพบุรุษร่วมกันอย่างน้อยปัญหาสามารถนำมาใช้ในการแก้ปัญหาในการเชื่อมต้นไม้แบบไดนามิกที่ฝังรากดังนั้นฉันคิดว่าคุณก็จะได้รับความสนใจในการต่อไปนี้: Optimal อัลกอริทึมสำหรับการค้นหาที่ใกล้ที่สุดบรรพบุรุษร่วมกันในแบบไดนามิกต้นไม้โดย Alstrup และ Thorup บทความนี้ให้เวลากับO(n+ม.เข้าสู่ระบบเข้าสู่ระบบn) สำหรับ n ลิงค์และ ม. เคียวรี nca บนเครื่องตัวชี้


ขอบคุณสำหรับการอ้างอิง. ปัญหาบรรพบุรุษร่วมที่ใกล้ที่สุดช่วยแก้ปัญหาการเข้าถึงต้นไม้ กระดาษที่คุณเชื่อมโยงเพื่ออธิบายต้นไม้ที่เพิ่มขึ้นพร้อมการดำเนินการทั้งหมดในO(lglg(n))เวลา. ฉันสงสัยว่ามันสามารถปรับปรุงให้ทำงานกับต้นไม้ที่มีชีวิตชีวาได้หรือไม่
bbejot
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.