การใช้งานโครงสร้างข้อมูลแบบไม่คงที่ (ถาวร) เหมือนอาร์เรย์ที่มีการจัดทำดัชนีอย่างรวดเร็วผนวกผนวกซ้ำ


11

ฉันกำลังมองหาโครงสร้างข้อมูลถาวรคล้ายกับอาเรย์ (แต่ไม่เปลี่ยนรูป) ให้การดำเนินการจัดทำดัชนีอย่างรวดเร็วผนวกต่อเติมและทำซ้ำ (ตำแหน่งที่ดี)

Clojure ให้ Vector แบบถาวร แต่มันเป็นเพียงการผนวกที่รวดเร็วเท่านั้น เวกเตอร์ของ Scala มีการเพิ่มและต่อเติมอย่างต่อเนื่องอย่างมีประสิทธิภาพ แต่ฉันไม่สามารถนำมาใช้ได้เนื่องจากมันขึ้นอยู่กับโครงสร้างข้อมูลเดียวกัน (bit-mapped vector trie) เป็นเวกเตอร์ Clojure และอย่างที่ฉันเข้าใจ trie เวกเตอร์บิตแมป ไม่สามารถเพิ่มความเร็วได้อย่างรวดเร็วหากไม่มีเทคนิคบางอย่าง

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

คำตอบ:


13

ผู้สมัครที่เห็นได้ชัดคือต้นไม้ไบนารีที่สมดุลถาวร การดำเนินงานทั้งหมดที่คุณระบุไว้สามารถดำเนินการในหรือO ( LG n )เวลาโดยการคัดลอกเส้นทาง สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการเพื่อให้บรรลุรันไทม์นี้เห็นหนังสือของคริสโอคาสากิอ้างอิงด้านล่างหรือคำตอบของฉันที่นี่O(1)O(lgn)

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

การอ้างอิงมาตรฐานคือหนังสือ 1998 ของ Chris Okasaki "โครงสร้างข้อมูลที่ใช้งานได้จริง"
ดูสิ่งนี้ด้วย


ขอบคุณ. ดูเหมือนว่าต้นไม้ RRB เป็นตัวเลือกที่ดีและพวกเขาก็มีการนำ Clojure ไปแล้ว (ไม่เต็ม)
Tvaroh

ฉันเดาว่าโอกาซากิบอกเราว่าจะบรรลุ runtimes เหล่านี้ภายใต้การเปลี่ยนแปลงไม่ได้และความเพียร?
ราฟาเอล

1
@ ราฟาเอล yup ฉันได้เพิ่มการอ้างอิงเพื่ออธิบายวิธีที่คุณบรรลุรันไทม์ (จุดเริ่มต้นของคำตอบของฉัน)
DW

4

ฉันได้อธิบายถึงการนำโครงสร้างข้อมูลไปใช้ในบทความของฉันเกี่ยวกับการจับคู่นิพจน์ทั่วไปที่เพิ่มขึ้น - ดูhttp://jkff.info/articles/ire/#ropes-strings-with-fast-concatenationและข้อความด้านล่างและด้านบนของส่วนนั้น .

มันเป็นต้นไม้ที่มีความสูงคงที่หลากหลาย (เช่นต้นไม้ B หรือ 2-3 ต้น) โดยทั่วไปจะเป็นต้นไม้ (2,3) ซึ่งมีใบเป็นอาร์เรย์ (N, 2N-1) เพื่อหลีกเลี่ยงค่าใช้จ่ายต่อองค์ประกอบ (A (N, 2N-1)) เป็นอาร์เรย์ที่มีความยาวอยู่ในช่วง N..2N-1) N ที่ใหญ่กว่าจะช่วยให้คุณมีค่าใช้จ่ายน้อยลง แต่เพิ่มความซับซ้อนของการแยกและการต่อข้อมูลเชิงเส้น การดำเนินการเช่นการจัดทำดัชนีการแยกและการต่อข้อมูลจะคล้ายกันมากกับวิธีการทำงานในต้นไม้ 2-3 ต้นโดยทั่วไปถึง (N, 2N-1) ที่ระดับใบไม้


ลิงค์แตก โปรดให้การอ้างอิงที่ถูกต้องและมีประสิทธิภาพ (ช่วยให้ผู้คนสามารถค้นหาเอกสารของคุณได้โดยไม่มีลิงก์)
Raphael

ฉันไม่ได้ตีพิมพ์ในวารสารใด ๆ เฉพาะในเว็บไซต์ส่วนตัวของฉัน ควรวางไว้บน Arxiv แม้ว่าเป็นความคิดที่ดี
jkff

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