สแตกได้


22

มีความรู้อะไรเกี่ยวกับโครงสร้างข้อมูลที่สามารถรักษาลำดับของไอเท็มได้ภายใต้สองการดำเนินการต่อไปนี้?

  • กด (x): เพิ่ม x ไปยังจุดสิ้นสุดของลำดับและส่งกลับตัวระบุสำหรับตำแหน่งในลำดับ
  • แยก (S): กำหนดชุดตัวระบุที่ไม่เรียงลำดับเอารายการในตำแหน่งเหล่านั้นออกจากลำดับและส่งคืนรายการของรายการที่ถูกลบตามลำดับ

หากคุณชอบคุณสามารถคิดว่านี่เป็นสแต็กหรือคิวที่มีการดำเนินการแยกที่แยกออกเป็นสองสแต็ค: การดำเนินการแยกสามารถนำมาใช้ในการดำเนินการป๊อปหรือ dequeue และวางลำดับของรายการที่แยกได้ กลับมาอีกครั้งในสแต็กหรือคิวที่แตกต่างกัน

สิ่งที่ฉันรู้แล้ว: หนึ่งสามารถรักษาลำดับเป็นรายการเชื่อมโยงสองเท่าโดยที่แต่ละตัวระบุเป็นเพียงตัวชี้ไปยังรายการเชื่อมโยงโหนดและแต่ละโหนดยังเก็บหมายเลขตำแหน่งที่ช่วยให้การเปรียบเทียบอย่างรวดเร็วระหว่างตำแหน่งของสององค์ประกอบที่ไม่เกี่ยวข้อง ในลำดับ การอัปเดตหมายเลขตำแหน่งเป็นการยากที่โครงสร้างข้อมูลจะดำเนินการเพื่อให้เป็นจำนวนเต็มบวกทั้งหมดของค่าสูงสุดโดยที่nคือจำนวนรายการปัจจุบันในรายการ ด้วยโครงสร้างข้อมูลนี้ส่วนที่ยากเพียงอย่างเดียวของการแยกข้อมูลคือการเรียงลำดับรายการที่แยกตามหมายเลขตำแหน่ง การแยกรายการkใช้เวลาO ( k O(n)nkเวลาแบบสุ่มที่คาดไว้โดยใช้อัลกอริทึมการเรียงลำดับจำนวนเต็มของ Han และ Thorup จาก FOCS 2002 และการดำเนินการ push ต้องใช้เวลาคงที่O(kloglogk)

สิ่งที่ฉันไม่รู้: เป็นไปได้ไหมที่จะจัดการกับสารสกัดในเวลาและผลักเวลาคงที่? มีวรรณกรรมเกี่ยวกับปัญหานี้หรือไม่? การเรียงลำดับจำนวนเต็มนั้นยากหรือไม่O(k)

แรงจูงใจ: นี่เป็นขั้นตอนพื้นฐานที่จำเป็นในการสั่งซื้อรายการในอัลกอริทึมการจัดตารางเวลา Coffman-Graham ซึ่งมีแอปพลิเคชันในการวาดกราฟ ส่วนที่ยากของ Coffman-Graham เป็นการเรียงลำดับทอพอโลยีแบบคำศัพท์ สิ่งนี้สามารถทำได้โดยการบำรุงรักษาสำหรับแต่ละ indegree ที่แตกต่างกันลำดับของจุดยอดที่มี indegree ในกราฟย่อยที่เกิดจากจุดยอดที่เหลือ จากนั้นให้ลบจุดยอดแรกออกจากลำดับของจุดยอดที่ไม่มีศูนย์และเพิ่มลงในลำดับโทโพโลยี แยกเพื่อนบ้านของvออกจากองศาที่พวกเขาเคยอยู่และผลักดันพวกมันไปยังลำดับสำหรับระดับที่เล็กกว่าถัดไป ดังนั้นO ( k )vvO(k) เวลาสำหรับการดำเนินการแยกข้อมูลในโครงสร้างข้อมูลนี้จะนำไปสู่การใช้เวลาเชิงเส้นของอัลกอริทึม Coffman-Graham

ตั้งแต่เริ่มแรกฉันได้พบบทความนี้โดย Sethi ตั้งแต่ปี 1976ที่อนุญาตให้ใช้อัลกอริทึม Coffman – Graham ในเวลาเชิงเส้นและรวมไว้ในบทความ Wikipediaของฉันใน Coffman-Graham algorithmดังนั้นแรงจูงใจดั้งเดิมจึงมีความหมายน้อยกว่า ฉันยังคงสงสัยว่าคำตอบคืออะไร


หากการแทรกเกิดขึ้นเฉพาะในตอนท้ายของลำดับคุณสามารถจัดการทั้งรายการเชื่อมโยงสองครั้งและตารางแฮชของตำแหน่งรายการ การแทรก: ตัดจำหน่าย O (1) (เพียงเก็บตัวชี้ไปยังรายการสุดท้าย) การแยกรายการ k: ค่าตัดจำหน่าย O (k) (สำหรับแต่ละองค์ประกอบของ S รับตัวชี้และลบออกจากตารางแฮชรับและลบรายการจากรายการและเพิ่มลงในผลการดึงข้อมูล)
Marzio De Biasi

3
ไม่ใช่การแยกรายการออกจากรายการที่ต้องใช้เวลา แต่จะจัดเรียงใหม่จากลำดับที่ไม่เรียงลำดับของอาร์กิวเมนต์เพื่อแยกลงในลำดับที่ถูกต้อง
David Eppstein

คำตอบ:


1

ผมคิดว่านี่เป็นอย่างน้อยเป็นเรื่องยากที่การเรียงลำดับชุดของจำนวนเต็มกับ "คำแนะนำสุ่ม" ขนาดพหุนามในn โดยคำแนะนำแบบสุ่มฉันหมายความว่าสำหรับการใด ๆnมีการกระจายการแก้ไขD n (ขึ้นอยู่เฉพาะบนn ) มากกว่าสตริงของโพลีขนาด ( nเข้าถึงโดยสุ่ม) และอัลกอริทึม (จำลองโดยเครื่องแรม) จะได้รับการตัวอย่างเดียวจากD n . D nคือโครงสร้างข้อมูล (สุ่ม) หลังจากกด[ n ]S[n]nnDnnnDnDn[n]ตามลำดับพร้อมกับตารางแฮชที่จับคู่จำนวนเต็มกับตัวระบุในเวลาคาดไว้O(1)

เนื่องจากการตั้งค่านั้นสำหรับอินสแตนซ์ของปัญหาการเรียงลำดับจำนวนเต็มเราสามารถออกสารสกัด ( S ) (ที่จริงแล้วเราต้องการตัวระบุของSแต่การทำแผนที่นี้สามารถทำได้ในเวลาO ( 1 )ต่อรายการโดยใช้แฮช ตารางที่เป็นส่วนหนึ่งของคำแนะนำ) และข้อมูลจะถูกจัดเรียงในเวลาที่ใช้ในการดำเนินการแยกS[n]SSO(1)

ดังนั้นข้อความคือเว้นแต่ว่าข้อมูลด้าน "ฟรี" บางอย่างที่ขึ้นอยู่กับขอบเขตบนของจำนวนเต็มสามารถทำให้การเรียงลำดับจำนวนเต็มง่ายขึ้นการแตกนั้นยากพอ ๆ กับการเรียงลำดับจำนวนเต็ม

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


[n]DnΩ(n)DnΩ(n)k[n]O(n+k)O(k)
เดฟ

Ω(n)DnkO(k)Dn

นี่คือเหตุผลที่ฉันไม่พบคำตอบที่น่าเชื่อทั้งหมดนี้ หากคุณมีจำนวนเต็มชุดเดียวที่คุณต้องการเรียงลำดับทุกอย่างเป็นเวลาเชิงเส้น (เพียงเรียงลำดับการนับเป็น O (n + k)) แต่ถ้าคุณกำลังพยายามใช้โครงสร้างข้อมูลนี้เพื่อจำลองลำดับของเรียงลำดับขนาดเล็กจำนวนมาก (เพื่อให้การเรียงลำดับการนับไม่ดีพอ) เฉพาะครั้งแรกของเรียงลำดับขนาดเล็กเหล่านี้เท่านั้นที่ไม่มีข้อ จำกัด : หลังจากนั้นคุณได้ลบบางส่วน ขององค์ประกอบของ [n] ดังนั้นแต่ละลำดับที่คุณเรียงลำดับจะต้องแยกออกจากลำดับก่อนหน้า ดังนั้นจึงเป็นเรื่องยากที่จะลดการเรียงลำดับงาน
David Eppstein

O(k)O(n+k)

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