การวิเคราะห์ความซับซ้อนของอัลกอริทึมในการใช้งานภาษาโปรแกรมเชิงฟังก์ชัน


10

ฉันได้เรียนรู้ในวันนี้ว่าการวิเคราะห์อัลกอริทึมนั้นแตกต่างกันตามโมเดลการคำนวณ มันเป็นสิ่งที่ฉันไม่เคยคิดหรือเคยได้ยิน

ตัวอย่างที่ให้ฉันซึ่งแสดงให้เห็นเพิ่มเติมโดย User @chiคือ:

เช่นพิจารณางาน: รับ ผลตอบแทน x_iใน RAM สิ่งนี้สามารถแก้ไขได้ใน เนื่องจากการเข้าถึงอาร์เรย์เป็นเวลาคงที่ การใช้ TM นั้นเราจำเป็นต้องสแกนอินพุตทั้งหมดดังนั้นx i O ( 1 ) O ( n )(ผม,x1,...,xn)xผมO(1)O(n)

ทำให้ฉันสงสัยเกี่ยวกับภาษาที่ใช้งานได้ จากความเข้าใจของฉัน "ภาษาหน้าที่มีความสัมพันธ์อย่างใกล้ชิดกับแคลคูลัสแลมบ์ดา" (จากความคิดเห็นของ Yuval Filmus ที่นี่ ) ดังนั้นหากภาษาที่ใช้งานอยู่บนพื้นฐานของแคลคูลัสแลมบ์ดา แต่พวกมันทำงานบนเครื่องที่ใช้ RAM เป็นวิธีที่เหมาะสมในการวิเคราะห์ความซับซ้อนของอัลกอริทึมที่ใช้งานโดยใช้โครงสร้างข้อมูลและภาษาที่ใช้งานได้จริง

ฉันไม่ได้มีโอกาสอ่านโครงสร้างข้อมูลที่ทำงานได้อย่างหมดจดแต่ฉันได้ดูที่หน้า Wikipedia สำหรับหัวเรื่องและดูเหมือนว่าโครงสร้างข้อมูลบางส่วนจะแทนที่อาร์เรย์แบบดั้งเดิมด้วย:

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

ในกรณีนั้นรูปแบบการคำนวณจะแตกต่างกันใช่มั้ย


3
ฉันไม่ใช่ผู้เชี่ยวชาญในหัวข้อนี้ แต่ฉันเชื่อว่าฉันได้ยินมาว่า 1) เครื่องที่เหมือนเสียงกระเพื่อม (ด้วยแบบจำลองต้นทุนของตัวเอง) สามารถจำลองโปรแกรม RAM ด้วยปัจจัยเพิ่มเติม (ดูง่ายต่อการพิสูจน์) ) และ 2) ว่าปัจจัยนี้จำเป็นจริง ๆ หรือไม่ยังเป็นปัญหาเปิดอยู่ นอกจากนี้อาจเป็นที่ถกเถียงกันอยู่ว่าการกำหนดค่าใช้จ่าย O (1) ให้กับการเข้าถึงอาเรย์ในรุ่น RAM นั้นใจกว้างเกินไป ในฮาร์ดแวร์การเข้าถึงหน่วยความจำต้องผ่านประตูที่คือขนาดหน่วยความจำกายภาพ O ( บันทึกn ) nO(เข้าสู่ระบบn)O(เข้าสู่ระบบn)n
Chi

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

1
ตัวอย่างของรูปแบบการคำนวณที่แตกต่างกันคือจำนวนของการลดลงของเบต้าที่ทำกับเทอมแคลคูลัสแลมบ์ดา ใน FP เราใช้แบบจำลอง ram แต่งตัวเป็นแคลคูลัสแลมบ์ดามากกว่าถ้าเป็นอย่างนั้น
Kurt Mueller

1
@ KurtMueller โปรดทราบว่าเราสามารถรับแลมบ์ดาขนาดหลังจากเพียงการลด bete เท่านั้น สิ่งนี้ทำให้แบบจำลองต้นทุนในการนับจำนวนของเบต้าที่ไม่สมจริง เนื้อหาที่ดีกว่าอาจจะชั่งน้ำหนักแต่ละขั้นตอนตามขนาดของคำศัพท์ในมือ แต่นี่ไม่ใช่รูปแบบที่เป็นไปได้เท่านั้น: การประเมินที่ดีที่สุดของคำแลมบ์ดาไม่ได้ใช้เบต้าในทางที่ไร้เดียงสาโดยเลือกใช้เครื่องลดกราฟที่ซับซ้อนกว่า ในกรณีเช่นนี้การนับจำนวน betas อาจไม่เหมาะสม O ( n )O(2n)O(n)
Chi

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

คำตอบ:


6

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

ฉันคิดว่าภาษาที่ใช้งานได้ส่วนใหญ่ไม่ได้ทำแบบนั้นและให้คำแถลงที่มีประโยชน์มากกว่าเช่น "การเรียกใช้ฟังก์ชันคือ O (1) ต่อท้ายรายการคือ O (1)" สิ่งต่าง ๆ เช่นนั้น


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

ใช่. นักออกแบบภาษาของคุณต้องบอกคุณว่าสิ่งที่คุณสามารถเขียนด้วยภาษาจริงหมายถึงอะไรก่อนที่คุณจะสามารถวิเคราะห์รันไทม์ของอัลกอริทึม
adrianN

"คุณไม่สามารถทำการวิเคราะห์อัลกอริทึมเกี่ยวกับการเขียนโปรแกรมภาษาแยก" - นี่หมายถึงภาษา FP หรือภาษาทั่วไป? ถ้ามันถูกอ้างถึงก่อนหน้านี้แล้วเราจะวิเคราะห์อัลกอริทึมในโรงเรียนในลักษณะทั่วไปเช่นการวิเคราะห์ข้ามปัญหา Java, C / C ++, Python อย่างไร เป็นเพราะพวกเขาทั้งหมดคล้ายกันมาก? หรือเป็นเพราะโครงสร้างข้อมูลพื้นฐาน & ADT นั้นเหมือนกันทั้งหมดและมีการใช้งานในลักษณะเดียวกันด้วยหรือไม่ หรือท้ายที่สุดเป็นเพราะหลักสูตรเหล่านี้เป็นเพียงเพื่อการศึกษาและไม่จำเป็นต้องแม่นยำอย่างเคร่งครัดหรือไม่
Abdul

1
มันเป็นเรื่องจริงสำหรับทุกภาษาโปรแกรม เพื่อให้ถูกต้องอย่างถูกต้องคุณต้องแก้ไขรุ่นของเครื่องก่อนพูด RAM และคำแนะนำที่รองรับ คุณสามารถทำการวิเคราะห์โปรแกรมโดยใช้คำแนะนำเหล่านั้นเท่านั้น จากนั้นคุณสามารถคิดถึงการแมปภาษาการเขียนโปรแกรมของคุณกับโมเดลเครื่องนั้น จากนั้นคุณสามารถวิเคราะห์โปรแกรมในภาษาการเขียนโปรแกรม สำหรับการรักษาที่เข้มงวดมากตรวจสอบว่า Knuth ทำได้อย่างไรใน The Art of Computer Programming สิ่งเหล่านี้สามารถลดความซับซ้อนลงได้เนื่องจากค่าคงที่ซ่อนตัวใหญ่
adrianN
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.