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


23

ลังเลปัญหากล่าวว่ามันเป็นไปไม่ได้ที่จะเขียนโปรแกรมที่สามารถตรวจสอบว่าหยุดโปรแกรมอื่นสำหรับโปรแกรมการป้อนข้อมูลเป็นไปได้ทั้งหมด

อย่างไรก็ตามฉันสามารถเขียนโปรแกรมที่สามารถคำนวณเวลาทำงานของโปรแกรมที่ชอบได้อย่างแน่นอน

for(i=0; i<N; i++)
    { x = 1; }

และคืนค่าความซับซ้อนของเวลาเป็นโดยไม่ต้องเรียกใช้N

สำหรับโปรแกรมอินพุตอื่น ๆ ทั้งหมดมันจะคืนค่าสถานะที่ระบุว่าไม่สามารถระบุเวลาที่ซับซ้อนได้

คำถามของฉันคือ:

ต้องมีเงื่อนไขอะไรเช่นนี้เราสามารถกำหนดขั้นตอนวิธีความซับซ้อนของเวลาของโปรแกรมที่กำหนดได้

* หากมีการอ้างอิงที่เป็นที่ยอมรับหรือตรวจสอบบทความนี้ฉันจะขอบคุณลิงค์ไปในความคิดเห็น


1
(1) "สัญกรณ์ O" ไม่ได้หมายถึง "ความซับซ้อนของเวลา" (2) มันไม่ชัดเจนว่าคุณหมายถึงอะไรโดย "O (อนันต์)" โปรดหลีกเลี่ยงการประดิษฐ์สัญกรณ์ใหม่หากเป็นไปได้ (3) การตัดสินใจว่าโปรแกรมที่กำหนดหยุดหรือไม่และให้ขอบเขตที่ชัดเจนเกี่ยวกับความซับซ้อนของเวลาของโปรแกรมนั้นแตกต่างกัน
Tsuyoshi Ito

1
ฉันไม่คุ้นเคยกับความซับซ้อนของเวลาของโปรแกรมในคลาสที่ จำกัด แต่หนึ่งคลาสของโปรแกรมที่น่าจะตรวจสอบได้เรียกว่า "โปรแกรมวนรอบ" ซึ่งมันง่ายต่อการ จำกัด เวลาของความซับซ้อน ฉันจำได้ว่าโปรแกรมวนรอบถูกกล่าวถึงในบทที่ 3 ของGems of Theological theor Scienceโดย Uwe Schöningและ Randall J. Pruim ในบริบทของการตัดสินใจเทียบเท่าสองโปรแกรม แต่ฉันไม่แน่ใจว่าบทของคุณมีความเกี่ยวข้องมากน้อยเพียงใด
Tsuyoshi Ito

4
ฉันสับสนเล็กน้อย ขอบเขตนี้เป็นเช่นไร? หนึ่งคำตอบที่สมเหตุสมผลสำหรับคำถามของ OP คือชิ้นส่วนภาษา (หรือแม้แต่คลาสของแฟรกเมนต์) ซึ่งสามารถกำหนดเวลาทำงานได้
Suresh Venkat


7
ฉันช้าไปมากในการแสดงความคิดเห็น เราดูเหมือนจะฉกฉวยช่วงเวลาที่โพสต์มีกลิ่น newbie-ish ฉันไม่ได้ชี้นิ้ว ฉันรู้สึกว่าสัญชาตญาณนี้เอง บางทีเราควรจะมีความอ่อนโยน OP ยอมรับว่าไม่คุ้นเคยกับพื้นที่หรือข้อกำหนด ไซต์ถามตอบคืออะไรถ้าเรายอมให้คนที่รู้ว่าพวกเขาต้องการอะไรและถามในภาษาของเรา
วีเจย์ D

คำตอบ:


23

TpT

input: n
run T for n steps
if T is in halting state, output: 0
otherwise, loop for n^2 steps and output: 0

pT

อย่างไรก็ตามงานจำนวนมากได้ดำเนินการเกี่ยวกับการคำนวณที่มีประสิทธิภาพของความซับซ้อนของโปรแกรม ฉันมีความชื่นชอบเป็นพิเศษสำหรับทฤษฎีความซับซ้อนโดยปริยายซึ่งมีจุดมุ่งหมายในการสร้างภาษาที่ใช้การสร้างพิเศษหรือสาขาวิชาประเภทหนึ่งอนุญาตให้หนึ่งเขียนโปรแกรมเฉพาะที่มีระดับความซับซ้อนที่กำหนดชัดเจน ด้วยสิ่งที่ฉันคิดว่าเป็นเรื่องมหัศจรรย์ปาฏิหาริย์ภาษาเหล่านี้มักจะสมบูรณ์สำหรับชั้นเรียนนั้น!

ตัวอย่างที่ดีอย่างหนึ่งได้อธิบายไว้ในบทความนี้โดย J.-Y แมเรียนซึ่งจะอธิบายเป็นภาษาที่มีความจำเป็นขนาดเล็กมีวินัยประเภทรับแรงบันดาลใจจากข้อมูลและการวิเคราะห์การไหลของการรักษาความปลอดภัยเทคนิคซึ่งจะช่วยให้ลักษณะของอัลกอริทึมในP


ในฐานะที่เป็นบันทึกด้านข้างโปรดดู Epigram ซึ่งเป็นภาษาที่สามารถรับประกันการเลิกจ้างได้
Realz Slaw

นี่เป็นการเริ่มต้นที่ดี แต่มีอะไรมากกว่าที่จะพูด? (ยกตัวอย่างเช่นมันดูเหมือนว่าฉันว่าให้ประถมฟังก์ชันเวียนรันไทม์ 's จะต้องตรงไปตรงมาคำนวณยังฟังก์ชั่นดังกล่าวสามารถแก้ปัญหาใด ๆ ในลำดับชั้นชี้แจง .... )
usul

ตราบเท่าที่มีความเป็นไปได้ที่จะตรวจสอบว่าโปรแกรมอินพุตนั้นเขียนด้วยภาษาที่ถูก จำกัด คุณสามารถสันนิษฐานได้ว่าความซับซ้อนของเวลานั้นถูก จำกัด ขอบเขตโดยอะไรก็ตาม อย่างไรก็ตามฟังก์ชั่นการเรียกซ้ำแบบดั้งเดิมจำนวนมากมีการเทียบเท่าแบบเรียกซ้ำโดยทั่วไปซึ่งมีประสิทธิภาพมากขึ้น
Chris Pressey

1
(บันทึกไว้โดยไม่ได้ตั้งใจว่าคอมเม้นท์นั้นเกินขีด จำกัด 5 นาทีประโยคที่สองควรอ่านดังนี้ :) อย่างไรก็ตามโปรแกรมในภาษาที่ จำกัด เหล่านี้อาจมีความเทียบเท่าในภาษาที่ จำกัด น้อยกว่าซึ่งมีประสิทธิภาพมากกว่า (โดยเฉพาะ แบบเรียกซ้ำทั่วไปที่มีประสิทธิภาพมากกว่า) ซึ่งในทางปฏิบัติส่งเสริมการใช้ภาษาที่ไม่ จำกัด และยากต่อการวิเคราะห์
Chris Pressey

นั่นน่าสนใจมากคริส! คุณมีข้อมูลอ้างอิงหรือไม่? ในความเป็นจริงดูเหมือนว่าเคาน์เตอร์ - inutitive: ฉันจะสงสัยว่าฟังก์ชัน recursive ดั้งเดิมสามารถจำลองฟังก์ชัน recursive ทั่วไปตามจำนวนขั้นตอนที่กำหนดซึ่งจะ จำกัด การเร่งความเร็วให้คงที่
ดี้

11

คำถามที่คุณโพสท่าและเคล็ดลับการนับที่เฉพาะเจาะจงที่คุณอธิบายเป็นคลาสสิกในการวิเคราะห์โปรแกรม มีปัญหาทางทฤษฎีของการวิเคราะห์ความซับซ้อนและมันเป็นรูปแบบการปฏิบัติในแง่ของการประเมินประสิทธิภาพของชิ้นส่วนของรหัสโดยอัตโนมัติ การวิเคราะห์อัตโนมัติดังกล่าวมีแอพพลิเคชั่นหลายตัวตั้งแต่การตรวจจับข้อบกพร่องด้านประสิทธิภาพจนถึงการประมาณราคาสำหรับการคำนวณบางอย่างในคลาวด์

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

วิธีที่สองคือการออกแบบภาษาการเขียนโปรแกรมที่ยอมรับเฉพาะโปรแกรมที่มีความซับซ้อน จำกัด นี่คือพื้นที่ของความซับซ้อนในการคำนวณโดยนัย

การอ้างอิงบางอย่างสำหรับทั้งสองพื้นที่เป็นไปตาม

  1. SPEED Projectเป็นหนึ่งในสายงานเฉพาะของการวิเคราะห์โปรแกรมที่มุ่งเน้นไปที่วิธีการหาขอบเขตบนเคาน์เตอร์เมื่อนำเข้าสู่โปรแกรม ตัวนับอาจวัดเวลาหรือการใช้พื้นที่
  2. การวิเคราะห์ทรัพยากรที่ตัดจำหน่ายหลายตัวแปร , Jan Hoffman, Klaus Aehlig, Martin Hoffman, ACM TOPLAS 2012
  3. เกี่ยวกับคุณสมบัติอัตราการเติบโตที่สามารถตัดสินใจได้ของโปรแกรมบังคับ , Amir Ben Amram, การพัฒนาใน Computational CompExational ComplExity 2010 นี่เป็นสายงานที่สวยงามในขอบเขตความซับซ้อนของโปรแกรมที่จำเป็นโดยข้อ จำกัด ทางไวยากรณ์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.