ตามPippenger [1996]เมื่อเปรียบเทียบระบบ LISP ที่สามารถใช้งานได้อย่างหมดจด (และมีความหมายการประเมินที่เข้มงวดไม่ขี้เกียจ) กับสิ่งที่สามารถกลายพันธุ์ข้อมูลอัลกอริทึมที่เขียนสำหรับ Lisp ที่ไม่บริสุทธิ์ที่ทำงานใน O ( n ) สู่อัลกอริทึมใน Lisp บริสุทธิ์ที่ทำงานในเวลา O ( n log n ) (ขึ้นอยู่กับการทำงานของBen-Amram และ Galil [1992]เกี่ยวกับการจำลองหน่วยความจำเข้าถึงโดยใช้ตัวชี้เท่านั้น) Pippenger สร้างว่ามีอัลกอริธึมที่ดีที่สุดที่คุณสามารถทำได้ มีปัญหาที่เป็น O ( n ) ในระบบที่ไม่บริสุทธิ์ซึ่งเป็นΩ ( n log n ) ในระบบบริสุทธิ์
มีคำเตือนเล็กน้อยที่จะทำเกี่ยวกับกระดาษนี้ สิ่งที่สำคัญที่สุดคือมันไม่ได้ใช้ภาษาที่ขี้เกียจเช่น Haskell เบิร์ดโจนส์และเดอมัวร์ [1997]แสดงให้เห็นว่าปัญหาที่สร้างขึ้นโดย Pippenger สามารถแก้ไขได้ในภาษาหน้าที่ขี้เกียจใน O ( n ) เวลา แต่พวกเขาไม่ได้สร้าง (และเท่าที่ฉันรู้ไม่มีใครมี) หรือ ไม่ใช่ภาษาที่ใช้งานได้อย่างขี้เกียจสามารถแก้ไขปัญหาทั้งหมดได้ในเวลาทำงานแบบ asymptotic เช่นเดียวกับภาษาที่มีการกลายพันธุ์
ปัญหาที่สร้างโดย Pippenger ต้องการΩ ( n log n ) ถูกสร้างขึ้นเป็นพิเศษเพื่อให้ได้ผลลัพธ์นี้และไม่จำเป็นต้องเป็นตัวแทนของปัญหาที่เกิดขึ้นจริงในทางปฏิบัติ มีข้อ จำกัด บางประการเกี่ยวกับปัญหาที่คาดไม่ถึง แต่จำเป็นสำหรับการพิสูจน์การทำงาน โดยเฉพาะอย่างยิ่งปัญหาต้องการให้มีการคำนวณผลลัพธ์แบบออนไลน์โดยไม่สามารถเข้าถึงอินพุตในอนาคตและอินพุตประกอบด้วยลำดับของอะตอมจากชุดอะตอมที่เป็นไปได้ที่ไม่ จำกัด มากมายแทนที่จะเป็นชุดขนาดคงที่ และกระดาษจะสร้างผลลัพธ์ (ขอบเขตล่าง) สำหรับอัลกอริธึมที่ไม่บริสุทธิ์ของเวลาการทำงานแบบเชิงเส้นเท่านั้น สำหรับปัญหาที่ต้องใช้เวลามากขึ้นเป็นไปได้ที่ O พิเศษ (log n) ปัจจัยที่พบในปัญหาเชิงเส้นอาจจะ "หมกมุ่น" ในกระบวนการของการดำเนินการพิเศษที่จำเป็นสำหรับอัลกอริทึมที่มีเวลาทำงานมากขึ้น ชี้แจงคำถามเหล่านี้และเปิดให้มีการสำรวจโดยสังเขปเบนอัมราม [1996]
ในทางปฏิบัติอัลกอริทึมจำนวนมากสามารถนำมาใช้ในภาษาหน้าที่บริสุทธิ์ที่มีประสิทธิภาพเช่นเดียวกับในภาษาที่มีโครงสร้างข้อมูลที่ไม่แน่นอน สำหรับการอ้างอิงที่ดีเกี่ยวกับเทคนิคที่จะใช้สำหรับการใช้โครงสร้างข้อมูลที่สามารถใช้งานได้อย่างมีประสิทธิภาพโปรดดู"โครงสร้างข้อมูลที่ใช้งานได้อย่างแท้จริง" ของคริสโอคาซากิ [Okasaki 1998] (ซึ่งเป็นวิทยานิพนธ์ฉบับขยายของเขา[Okasaki 1996] )
ทุกคนที่ต้องการใช้อัลกอริทึมกับโครงสร้างข้อมูลที่ทำงานได้อย่างหมดจดควรอ่าน Okasaki คุณสามารถลด O (log n ) ที่เลวร้ายที่สุดต่อการดำเนินการโดยจำลองหน่วยความจำที่ไม่แน่นอนด้วยต้นไม้ไบนารีที่สมดุล แต่ในหลาย ๆ กรณีคุณสามารถทำได้ดีกว่านั้นมากและ Okasaki อธิบายเทคนิคที่มีประโยชน์มากมายตั้งแต่เทคนิคตัดจำหน่ายจนถึงจริง เวลาที่ทำงานที่ถูกตัดจำหน่ายเพิ่มขึ้น โครงสร้างข้อมูลที่ทำงานได้อย่างหมดจดอาจเป็นบิตยากที่จะทำงานกับและวิเคราะห์ แต่พวกเขาให้ประโยชน์มากมายเช่นความโปร่งใสอ้างอิงที่เป็นประโยชน์ในการเพิ่มประสิทธิภาพของคอมไพเลอร์ในการคำนวณแบบขนานและแบบกระจายและในการใช้งานคุณสมบัติเช่นการกำหนดรุ่นยกเลิกและย้อน
โปรดทราบว่าสิ่งเหล่านี้ทั้งหมดกล่าวถึงเวลาการทำงานแบบซีมโทติคเท่านั้น เทคนิคหลายอย่างสำหรับการนำโครงสร้างข้อมูลที่ใช้งานได้จริงมาใช้นั้นทำให้คุณมีการชะลอตัวของปัจจัยคงที่จำนวนหนึ่งเนื่องจากการทำบัญชีพิเศษที่จำเป็นสำหรับพวกเขาในการทำงานและรายละเอียดการใช้ภาษาที่เป็นปัญหา ประโยชน์ของโครงสร้างข้อมูลที่ทำงานได้อย่างแท้จริงอาจมีมากกว่าการชะลอตัวของปัจจัยคงที่เหล่านี้ดังนั้นคุณจะต้องทำการแลกเปลี่ยนตามปัญหาที่เกิดขึ้น
อ้างอิง
- เบ็น - อัมรามอาเมียร์และกาลิลซวี่ 1992 "คำแนะนำเทียบกับที่อยู่"วารสาร ACM, 39 (3), pp. 617-648, กรกฎาคม 2535
- Ben-Amram, Amir 1996. "หมายเหตุเกี่ยวกับการเปรียบเทียบ Pippenger's Lisp ที่บริสุทธิ์และไม่บริสุทธิ์"ต้นฉบับที่ไม่ได้เผยแพร่ DIKU, มหาวิทยาลัยโคเปนเฮเกน, เดนมาร์ก
- เบิร์ดริชาร์ดโจนส์ Geraint และเดอมัวร์ Oege 1997 "เร็วกว่าเร็วกว่า: ขี้เกียจกับความกระตือรือร้นในการประเมิน"วารสารการเขียนโปรแกรมเชิงปฏิบัติการ 7, 5 pp 541-547, กันยายน 1997
- Okasaki, Chris 1996. "โครงสร้างข้อมูลที่ใช้งานได้จริง"วิทยานิพนธ์ปริญญาเอก, Carnegie Mellon University
- Okasaki, Chris 1998. "โครงสร้างข้อมูลที่ใช้งานได้จริง" Cambridge University Press, Cambridge, UK
- Pippenger, Nicholas 1996. "Pure Versus Impure Lisp" Symposium ACM บนหลักการของภาษาโปรแกรม, หน้า 104–109, มกราคม 1996