ฉันต้องการเรียนรู้วิธีสร้างกราฟและดำเนินการบางอย่างกับพวกเขาใน Haskell แต่คำถามนั้นไม่เฉพาะเจาะจงกับ Haskell และแทนที่จะเป็นกราฟเราอาจพิจารณาเชื่อมโยงรายการเป็นสองเท่า
คำถาม: อะไรจะเป็นสำนวนหรือแนะนำวิธีการใช้รายการเชื่อมโยงทวีคูณ (หรืออื่น ๆ ที่เชื่อมโยงทวีคูณหรือโครงสร้างข้อมูลแบบวงกลม) และการดำเนินงานในภาษาที่สนับสนุนและสนับสนุนสำหรับโครงสร้างข้อมูลที่ไม่เปลี่ยนรูปแบบ (Haskell, Clojure เป็นต้น) ? โดยเฉพาะอย่างยิ่งวิธีการใช้การอัปเดตในสถานที่ซึ่งภาษาต้องห้ามอย่างเป็นทางการ?
ฉันสามารถจินตนาการได้อย่างง่ายดายว่าหากมีการดำเนินการในท้องถิ่นในรายการที่ลิงก์ซ้ำกัน (หากมีการแทรกรายการไว้) อาจไม่จำเป็นต้องคัดลอกรายการทั้งหมดทันทีเนื่องจากความเกียจคร้านของภาษา อย่างไรก็ตามเนื่องจากรายการมีการเชื่อมโยงเป็นสองเท่าหากมีการแก้ไขในที่เดียวจึงไม่มีโหนดเก่าที่สามารถใช้ในรายการเวอร์ชันใหม่และพวกเขาจะต้องทำเครื่องหมายคัดลอกคัดลอกเก็บขยะไม่ช้า . เห็นได้ชัดว่าสิ่งเหล่านี้เป็นการดำเนินการที่ซ้ำซ้อนหากจะใช้เฉพาะสำเนาที่ปรับปรุงแล้วของรายการ แต่พวกเขาจะเพิ่มสัดส่วน "ค่าใช้จ่าย" ตามขนาดของรายการ
นี่หมายความว่าสำหรับงานดังกล่าวข้อมูลที่ไม่เปลี่ยนรูปแบบนั้นไม่เหมาะสมและภาษาที่ประกาศได้โดยไม่ต้องมีการสนับสนุน "ดั้งเดิม" สำหรับข้อมูลที่ไม่แน่นอนไม่ดีเท่าที่จำเป็นหรือไม่? หรือมีวิธีแก้ปัญหาที่ยุ่งยากบ้างไหม?
ป.ล. ฉันได้พบบทความและงานนำเสนอบางอย่างเกี่ยวกับเรื่องนี้ในอินเทอร์เน็ต แต่มีความยากลำบากในการติดตามพวกเขาในขณะที่ฉันคิดว่าคำตอบของคำถามนี้ไม่ควรใช้มากกว่าหนึ่งย่อหน้าและอาจเป็นไดอะแกรม ... ฉันหมายถึงถ้ามี ไม่มีวิธีแก้ปัญหา "ฟังก์ชั่น" สำหรับปัญหานี้คำตอบน่าจะเป็น "ใช้ C" หากมีอย่างใดอย่างหนึ่งมันจะซับซ้อนแค่ไหน?
คำถามที่เกี่ยวข้อง
"โครงสร้างข้อมูลในการโปรแกรมเชิงฟังก์ชัน" . คำถามเฉพาะของฉันเกี่ยวกับการใช้การอัปเดตแบบแทนที่ไม่ใช้ทางเลือกที่ไม่มีประสิทธิภาพ
การกลายพันธุ์ภายในของโครงสร้างข้อมูลถาวร " . ดูเหมือนจะเน้นไปที่การใช้งานในระดับต่ำในภาษาที่ไม่ได้ระบุในขณะที่คำถามของฉันเกี่ยวกับการเลือกภาษาที่ถูกต้อง (การใช้งานหรืออื่น ๆ ) และการแก้ปัญหาเชิงสำนวนที่เป็นไปได้ในภาษาที่ใช้งานได้
ใบเสนอราคาที่เกี่ยวข้อง
ภาษาการเขียนโปรแกรมที่ใช้งานได้จริงช่วยให้อัลกอริธึมหลายอย่างแสดงออกมาอย่างกระชับ แต่มีอัลกอริธึมบางอย่างที่สถานะที่สามารถอัปเดตได้ในสถานที่ดูเหมือนจะมีบทบาทสำคัญ สำหรับอัลกอริทึมเหล่านี้ภาษาที่ใช้งานได้จริงซึ่งไม่มีสถานะที่สามารถอัปเดตได้ดูเหมือนจะไม่มีประสิทธิภาพโดยแท้จริง ( [Ponder, McGeer และ Ng, 1988] )
- John Launchbury และ Simon Peyton Jones, Lazy functional threads (1994), John Launchbury และ Simon Peyton Jones, Haskell (1995) เอกสารเหล่านี้แนะนำตัวSTสร้างประเภท monadic ใน Haskell
DiffArrayประเภท มองไปที่แหล่งที่มาของdiffArrayแพคเกจ 91 unsafePerformIOฉันเห็นการเกิดขึ้นของ ดูเหมือนว่าคำตอบสำหรับคำถามของฉันคือ "ใช่ไม่ใช่ภาษาที่ใช้งานได้จริงกับข้อมูลที่ไม่เปลี่ยนรูปแบบไม่เหมาะสมสำหรับการใช้อัลกอริทึมที่โดยปกติแล้วใช้การอัปเดตแบบแทนที่"
Map, IntMapหรือHashMap) ในขณะที่การจัดเก็บข้อมูลและเพื่อให้โหนดมีรหัสของโหนดที่เชื่อมโยง "ปัญหาทั้งหมดในวิทยาการคอมพิวเตอร์สามารถแก้ไขได้โดยการอ้อมอีกระดับ