ความซับซ้อนของอัลกอริทึมเป็นแบบจำลองสำหรับภาษาที่ใช้งานได้อย่างไร


38

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

ควรมีแบบจำลองทางเลือกของความซับซ้อนของอัลกอริทึมสำหรับภาษาที่ใช้งานได้หรือไม่?


3
นี่อาจเป็นสิ่งที่คุณกำลังมองหา
Aristu

1
คำถามของคุณอาจจะมีการตอบที่นี่: cs.stackexchange.com/q/18262/755 โดยเฉพาะอย่างยิ่งความซับซ้อนของเวลาในภาษาฟังก์ชั่นล้วนแตกต่างจากความซับซ้อนของเวลาในภาษาที่จำเป็นโดยส่วนใหญ่อัตราส่วนสำหรับสมมติฐานที่เหมาะสมในความสามารถของทั้งสองภาษา O(logn)
DW

3
GHC Haskell รองรับอาเรย์และโครงสร้างที่ไม่แน่นอนและสิ่งที่ไม่อนุญาตให้คุณเข้าถึงอาร์เรย์และแก้ไขโหนดต้นไม้ในเวลา O (1) โดยใช้ "state threads" ( STmonads)
แทนเนอร์ Swett

1
@BobJarvis ขึ้นอยู่กับ รายการเป็นประเภทข้อมูลนามธรรมสำหรับคุณหรือคุณกำลังพิจารณาเฉพาะรายการที่ลิงก์?
กราฟิลส์

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

คำตอบ:


34

หากคุณคิดว่า -calculus เป็นรูปแบบที่ดีของภาษาโปรแกรมที่ใช้งานได้คุณอาจคิดว่า: -calculus มีความคิดเรียบง่ายเกี่ยวกับเวลา - ความซับซ้อน: เพียงนับจำนวนของขั้นตอนการหักล้างx]λλβ(λx.M)NM[N/x]

แต่นี่เป็นการวัดความซับซ้อนที่ดีหรือไม่?

เพื่อตอบคำถามนี้เราควรอธิบายให้ชัดเจนว่าเราหมายถึงอะไรโดยการวัดความซับซ้อนตั้งแต่แรก หนึ่งคำตอบที่ดีนั้นได้รับจากวิทยานิพนธ์ของSlot และ van Emde Boas : การวัดที่ซับซ้อนใด ๆ ควรมีความสัมพันธ์พหุนามกับความเชื่อตามเวลาที่กำหนดโดยใช้เครื่องจักรทัวริง กล่าวอีกนัยหนึ่งควรมีการเข้ารหัส 'สมเหตุสมผล'จากข้อกำหนดของ -calculus ไปยังเครื่องจักรทัวริงเช่นสำหรับพหุนามบางกรณีในแต่ละเทอมขนาด:ลดลงเป็นค่าใน -reduction ขั้นตอนที่แน่นอนเมื่อลดลงเป็นค่าในtr(.)λpM|M|Mp(|M|) βtr(M)p(|tr(M)|)ขั้นตอนของเครื่องทัวริง

เป็นเวลานานมันก็ไม่ชัดเจนว่าสิ่งนี้สามารถทำได้ใน calcul-แคลคูลัส ปัญหาหลักมีดังนี้

  • มีคำศัพท์ที่ใช้สร้างแบบฟอร์มปกติ (ในจำนวนพหุนามของขั้นตอน) ที่มีขนาดเอ็กซ์โพเนนเชียล แม้แต่การเขียนแบบฟอร์มปกติก็ต้องใช้เวลาชี้แจง
  • กลยุทธ์การลดที่เลือกมีบทบาทสำคัญ ตัวอย่างเช่นมีตระกูลของเทอมที่ลดจำนวนพหุนามของ steps-steps แบบขนาน (ในแง่ของการลด optimal ที่ดีที่สุด ) แต่ความซับซ้อนนั้นไม่ได้อยู่ในระดับประถมศึกษา

กระดาษ " การลดเบต้าเป็นค่าคงที่แน่นอน " โดย B. Accattoli และ U. Dal Lago ให้ความกระจ่างแก่ปัญหาโดยแสดงการเข้ารหัส 'สมเหตุสมผล' ที่รักษาระดับความซับซ้อนPของฟังก์ชันเวลาพหุนามโดยสมมติว่าการลดการโทรโดยชื่อซ้ายสุด . ความเข้าใจที่สำคัญคือการระเบิดแบบเอ็กซ์โปเนนเชียลสามารถเกิดขึ้นได้สำหรับเหตุผล 'ไม่น่าสนใจ' ซึ่งสามารถเอาชนะได้โดยการแบ่งปันที่เหมาะสม กล่าวอีกนัยหนึ่งคลาสPเหมือนกันไม่ว่าคุณจะกำหนดให้นับขั้นตอนของเครื่องจักรทัวริงหรือ (ซ้ายสุด - ด้านนอกสุด) -reductionβ

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


23

ความซับซ้อนของอัลกอริทึมถูกออกแบบมาให้เป็นอิสระจากรายละเอียดในระดับต่ำ

ไม่ไม่ได้จริงๆ เรามักจะนับการทำงานเบื้องต้นในเครื่องบางรุ่น:

  • ขั้นตอนสำหรับทัวริงเครื่อง
  • การใช้งานเบื้องต้นบนแรม

คุณอาจนึกถึง / / -business ทั้งหมด ในขณะที่มันเป็นความจริงที่คุณสามารถสรุปรายละเอียดการปรับใช้บางส่วนได้ด้วย Asymptotics ของ Landau แต่คุณจะไม่กำจัดผลกระทบของโมเดลเครื่อง อัลกอริทึมมีเวลาในการทำงานที่แตกต่างกันมากพูดTMs และแรม- แม้ว่าคุณจะพิจารณาเฉพาะ -classes!ΩΘOΘ

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


ตกลง บันทึก Side: คนไม่บ่อยทำให้จำนวนมากของความผิดพลาดเกี่ยวกับสิ่งที่การดำเนินงานเป็น "คงที่" เช่นสมมติว่า a + b คือO(1)เมื่อเป็นจริงO(log ab)
Paul Draper

3
@ PaulDraper เป็นข้อสันนิษฐานที่แตกต่างกันไม่จำเป็นต้องเป็นข้อผิดพลาด เราสามารถสร้างแบบจำลองสิ่งที่เราต้องการ - คำถามคือถ้ามันตอบคำถามที่น่าสนใจ ดูที่นี่ด้วย
ราฟาเอล

ฟังดูแย่มากเช่น "กำจัดโมเดลเครื่อง"
Paul Draper

@PaulDraper ขึ้นอยู่กับชนิดของความรู้สึกที่คุณแนบกับคำว่า "machine" ดูการสนทนานี้ด้วย FWIW รูปแบบ RAM ราคาต่อหน่วย - เป็นรูปแบบมาตรฐานในการวิเคราะห์อัลกอริทึม! - มีประโยชน์ไม่เช่นนั้นจะไม่ได้ใช้มานานหลายทศวรรษแล้ว ขอบเขตที่คุ้นเคยทั้งหมดสำหรับการเรียงลำดับการค้นหาปอยผม ฯลฯ ขึ้นอยู่กับรุ่นนั้น มันสมเหตุสมผลแล้วเพราะมันจำลองคอมพิวเตอร์จริง ๆ ตราบเท่าที่ตัวเลขพอดีกับการลงทะเบียน
ราฟาเอล

1

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


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