ฉันต้องการเรียนรู้วิธีสร้างกราฟและดำเนินการบางอย่างกับพวกเขาใน 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
) ในขณะที่การจัดเก็บข้อมูลและเพื่อให้โหนดมีรหัสของโหนดที่เชื่อมโยง "ปัญหาทั้งหมดในวิทยาการคอมพิวเตอร์สามารถแก้ไขได้โดยการอ้อมอีกระดับ