คลาสของโครงสร้างข้อมูลใดที่สามารถคงอยู่ได้?


19

โครงสร้างข้อมูลถาวรเป็นโครงสร้างข้อมูลที่ไม่เปลี่ยนรูป การดำเนินการกับพวกเขากลับ "สำเนา" ใหม่ของโครงสร้างข้อมูล แต่การเปลี่ยนแปลงโดยการดำเนินการ; โครงสร้างข้อมูลเก่ายังคงไม่เปลี่ยนแปลง ประสิทธิภาพโดยทั่วไปสามารถทำได้โดยการแบ่งปันข้อมูลบางส่วนและหลีกเลี่ยงการคัดลอกโครงสร้างข้อมูลอย่างสมบูรณ์

คำถาม:

  • มีผลลัพธ์เกี่ยวกับคลาสของโครงสร้างข้อมูลที่สามารถทำให้เป็นแบบถาวร (ในขณะที่รักษาความซับซ้อนที่เหมือนกันหรือคล้ายกันมาก)?

  • สามารถทุกโครงสร้างข้อมูลจะทำถาวร (ในขณะที่การรักษาความซับซ้อนเดียวกันหรือคล้ายกันมาก)?

  • ทราบว่าโครงสร้างข้อมูลใดไม่สามารถคงอยู่ได้ (ในขณะที่รักษาความซับซ้อนที่เหมือนกันหรือคล้ายกันมาก)?


1
คุณไม่สามารถทำให้เวกเตอร์คงอยู่กับความซับซ้อน O (1) ที่สงวนไว้สำหรับการเข้าถึงองค์ประกอบแบบสุ่ม
Smossen


2
@smossen คุณสามารถพิสูจน์ได้หรือไม่
Realz Slaw

1
คำถามแรกของคุณเป็นคำถามที่กว้างมาก มีผลลัพธ์จำนวนมากในหัวข้อของโครงสร้างข้อมูลที่สามารถทำให้ขัดขืนได้ มีใครสามารถเขียนหนังสือทั้งเล่มเกี่ยวกับเรื่องนี้ได้และบางคนก็มีเช่นหนังสือของโอกาซากิเป็นหนังสือแบบคลาสสิก คุณได้ทำการวิจัยในหัวข้อนี้บ้างไหม? คุณช่วย จำกัด คำถามให้แคบลงได้ไหม? ฉันคิดว่ามันกว้างเกินไปที่จะเป็นเว็บไซต์ที่ดีสำหรับเว็บไซต์นี้ อาจแยกคำถามที่ 3 ออกเป็นคำถามแยกต่างหาก
DW

@ Realz Slaw: ฉันไม่สามารถพิสูจน์ได้อย่างเป็นทางการ แต่ฉันคิดว่ามันเป็นเรื่องธรรมดา O (1) การเข้าถึงองค์ประกอบในเวกเตอร์ (รวมถึงตารางแฮช) ขึ้นอยู่กับเวลาที่แน่นอนสำหรับการถอดรหัสที่อยู่บนฮาร์ดแวร์ที่กำหนด วิริยะเพิ่มหนึ่งหรือสองมิตินอกเหนือจากดัชนีเวกเตอร์ แต่ที่อยู่ฮาร์ดแวร์ยังคงเป็นหนึ่งมิติ
Smossen

คำตอบ:


22

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

พิสูจน์: คุณสามารถใช้อาเรย์และทำให้มันคงอยู่ได้โดยใช้โครงสร้างข้อมูลมาตรฐาน (เช่นต้นไม้ไบนารีที่สมดุลดูที่ส่วนท้ายของคำตอบนี้เพื่อดูรายละเอียดเพิ่มเติมเล็กน้อย) นี่เป็นการชะลอตัวของ : การเข้าถึงอาร์เรย์แต่ละครั้งต้องใช้เวลาด้วยโครงสร้างข้อมูลถาวรแทนที่จะเป็นเวลาสำหรับอาร์เรย์ที่ไม่ใช่แบบถาวร ตอนนี้ใช้อัลกอริทึมที่จำเป็นซึ่งเวลารันในโมเดล RAM คือโดยที่หมายถึงจำนวนหน่วยความจำที่ใช้ แสดงหน่วยความจำทั้งหมดเป็นหนึ่งอาร์เรย์ใหญ่ (พร้อมองค์ประกอบ ) และทำให้มันคงอยู่โดยใช้แผนที่ถาวร แต่ละขั้นตอนของอัลกอริทึมที่จำเป็นเกิดขึ้นอย่างช้าที่สุดชะลอตัวดังนั้นเวลาการทำงานโดยรวมคือO ( lg n ) O ( 1 ) O ( f ( n ) ) n nO(lgn)O(lgn)O(1)O(f(n))nnO ( f ( n ) lg n )O(lgn)O(f(n)lgn)n)

เห็นได้ชัดว่ามันเป็นไปได้ที่จะทำให้ดีขึ้นเล็กน้อย: เห็นได้ชัดว่าสามารถลดปัจจัยการชะลอตัวลงเป็น (คาดว่าเวลาตัดจำหน่าย) โดยใช้เทคนิคในกระดาษ Demaine ที่อ้างถึงด้านล่าง - แต่ฉันไม่คุ้นเคย รายละเอียดของงานนั้นดังนั้นฉันไม่สามารถรับรองด้วยตัวเอง ขอบคุณ jbapple สำหรับการสังเกตนี้O(lglgn)


ผลลัพธ์เชิงลบ: คุณไม่สามารถหลีกเลี่ยงการชะลอตัวบางอย่างสำหรับโครงสร้างข้อมูลบางอย่าง เพื่อตอบคำถามที่สามของคุณมีโครงสร้างข้อมูลที่ทราบว่าการคงอยู่ทำให้เกิดการชะลอตัว

โดยเฉพาะอย่างยิ่งให้พิจารณาอาร์เรย์ขององค์ประกอบการเข้าถึงอาร์เรย์แต่ละครั้งจะใช้เวลา (ในรุ่น RAM) เห็นได้ชัดว่ามันแสดงให้เห็นว่าไม่มีทางที่จะสร้างอาร์เรย์ถาวรด้วยความซับซ้อนกรณีที่เลวร้ายที่สุดสำหรับการเข้าถึงองค์ประกอบแบบสุ่ม เห็นได้ชัดว่ามีขอบเขตที่ต่ำกว่าแสดงว่าอาร์เรย์ถาวรทั้งหมดต้องมีเวลาในการเข้าถึงขอบเขตล่างนี้ได้รับการยืนยันบนหน้า 3 ของกระดาษต่อไปนี้:O ( 1 ) O ( 1 ) Ω ( lg lg n )nO(1)O(1)Ω(lglgn)

  • Confluently พยายามต่อเนื่องสำหรับการที่มีประสิทธิภาพในการควบคุมเวอร์ชัน Erik D. Demaine, Stefan Langerman, Eric Price อัลกอริทึม, เล่มที่ 57, หมายเลข 3, 2010, หน้า 462–483

ขอบเขตด้านล่างมีสาเหตุมาจาก Mihai Patrascu แต่ไม่มีการอ้างอิงถึงแหล่งข้อมูลที่ให้รายละเอียดเกี่ยวกับการพิสูจน์หลักฐานของขอบเขตล่างที่ยืนยันนี้


การวิจัยที่หลากหลาย ถ้าเราใช้โครงสร้างข้อมูลหรืออัลกอริทึมโดยพลการมันเป็นคำถามที่ละเอียดอ่อนไม่ว่าคุณจะสามารถทำให้มันคงอยู่กับการชะลอตัวของมากที่สุดหรือไม่ ฉันไม่รู้ทฤษฎีบทการจำแนกประเภททั่วไป อย่างไรก็ตามมีงานวิจัยจำนวนมากเกี่ยวกับวิธีการทำให้โครงสร้างข้อมูลที่เฉพาะเจาะจงคงอยู่ในวิธีที่มีประสิทธิภาพO(1)

นอกจากนี้ยังมีการเชื่อมต่อที่แข็งแกร่งกับภาษาโปรแกรมการทำงาน โดยเฉพาะอย่างยิ่งโครงสร้างข้อมูลทุกอย่างที่สามารถนำไปใช้งานได้อย่างหมดจด (โดยไม่มีการกลายพันธุ์) นั้นเป็นโครงสร้างข้อมูลถาวร (การสนทนาไม่จำเป็นต้องเป็นกรณีนี้เลย) ถ้าคุณต้องการเหล่ตาคุณสามารถใช้สิ่งนี้เป็นทฤษฎีบทการจำแนกบางส่วนที่อ่อนแอ: หากสามารถนำไปใช้ในภาษาการเขียนโปรแกรมที่ใช้งานได้อย่างหมดจดพร้อมกับขอบเขตในเวลาเดียวกัน ภาษาที่จำเป็นแล้วมีโครงสร้างข้อมูลถาวรที่มีขอบเขตในเวลาเดียวกันกับที่ไม่ใช่แบบถาวร ฉันรู้ว่านี่อาจไม่ใช่สิ่งที่คุณกำลังมองหา - มันเป็นเพียงแค่การพูดเรื่องเล็ก ๆ น้อย ๆ เกี่ยวกับสถานการณ์


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

ความคิดพื้นฐานคือการที่เราสามารถใช้โครงสร้างข้อมูลต้นไม้ไบนารีและทำให้มันถาวรโดยใช้เทคนิคที่เรียกว่าการคัดลอกเส้นทาง สมมติว่าเรามีต้นไม้ไบนารีและเราต้องการที่จะปรับเปลี่ยนค่าในใบบาง\อย่างไรก็ตามสำหรับการคงอยู่เราไม่กล้าแก้ไขค่าในลีฟนั้น เราทำสำเนาใบไม้นั้นและแก้ไขค่าในสำเนาแทน จากนั้นเราจะทำสำเนาของแม่และเปลี่ยนตัวชี้เด็กที่เหมาะสมในการคัดลอกเพื่อชี้ไปที่ใบไม้ใหม่ ดำเนินการต่อด้วยวิธีนี้การโคลนแต่ละโหนดบนเส้นทางจากรูทไปที่ลีฟ ถ้าเราต้องการที่จะปรับเปลี่ยนใบที่ระดับความลึกนี้ต้องคัดลอกโหนดd ddd

ถ้าเรามีต้นไม้ไบนารีสมดุลมีโหนดแล้วทุกใบมีความลึกเพื่อให้การดำเนินการนี้บนต้นไม้ไบนารีใช้เวลาเวลา มีรายละเอียดบางอย่างที่ฉันกำลังข้าม - เพื่อให้ได้เวลากรณีที่เลวร้ายที่สุดเราอาจต้องปรับสมดุลต้นไม้เพื่อให้แน่ใจว่ามันยังคงสมดุล - แต่นี่ให้ส่วนสำคัญของมันO ( lg n ) O ( lg n ) O ( lg n )nO(lgn)O(lgn)O(lgn)

คุณสามารถค้นหาคำอธิบายเพิ่มเติมด้วยรูปภาพสวย ๆ ได้จากแหล่งข้อมูลต่อไปนี้:

  • อ่านส่วนที่ระบุว่า "ต้นไม้ค้นหาแบบทวิภาค" และ "โครงสร้าง random-access" (เฉพาะวิธีต้นไม้) ที่http://toves.org/books/persist/index.html

  • หรืออ่านhttp://netcode.ru/dotnet/?artID=6592#BinaryTreesและบางส่วนที่ตามมา

  • หรืออ่านส่วนที่มีข้อความว่า "โครงสร้างข้อมูลที่ใช้งานได้" และ "การคัดลอกเส้นทาง" (เริ่มจากหน้า 4) ของกระดาษ Demaine ที่อ้างถึงด้านบน: http://erikdemaine.org/papers/ConfluentTries_Algorithmica/paper.pdf

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


ฉันไม่เข้าใจในย่อหน้าแรกจริง ๆ แล้วฉันจะสร้างอาร์เรย์แบบถาวรโดยใช้ต้นไม้สีแดงดำได้อย่างไร
G. Bach

@ G.Bach มีคำอธิบายที่ดีงามในส่วนที่ระบุว่า "ต้นไม้ค้นหาแบบทวิภาค" และ "โครงสร้าง random-access" (เฉพาะวิธีต้นไม้) ที่toves.org/books/persist/index.html สำหรับคำอธิบายที่ดีอีกตัวโปรดดูnetcode.ru/dotnet/?artID=6592#BinaryTreesและส่วนต่อไปบางส่วน ที่จะทำให้คุณมีความคิดหลัก รายละเอียดอยู่นอกขอบเขตสำหรับคำถามนี้ แต่นี่เป็นเนื้อหามาตรฐานทั้งหมด ฉันขอแนะนำให้คุณถามคำถามแยกต่างหากหากคุณต้องการข้อมูลเพิ่มเติมเกี่ยวกับวิธีสร้างโครงสร้างข้อมูลดังกล่าว
DW

4
คำตอบที่ดี, DW คุณสามารถนำเวลาที่ถูกผูกไว้ลงไป (คาดว่าตัดจำหน่าย)n) ดูDemaine et al. "พยายามอย่างต่อเนื่องเพื่อการควบคุมเวอร์ชันอย่างมีประสิทธิภาพ"O(lglgn)
jbapple
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.