อัลกอริทึมคืออะไร?


12

ฉันรู้ว่านี่อาจฟังดูแปลกไปหน่อยในความเป็นจริงฉันเคยคิดเสมอในกล่อง แต่เมื่อเร็ว ๆ นี้ฉันได้คิดว่าอาจเป็นเพราะวิทยาการคอมพิวเตอร์ให้อิสระในระดับสูงเกี่ยวกับวิธีการประดิษฐ์โปรแกรมอื่นที่ไม่ใช่ สิ่งที่สอนในมหาวิทยาลัย

พิจารณาฟังก์ชันแฟกทอเรียล โดยทั่วไปแล้วเรากำหนดฟังก์ชั่นนี้เช่น

 int fact(int n) 
 { 
 int r = 1; 
 for(int i=2;i<=n;i++) 
 r = r*i; 
 return r; 
 } 

ฉันจะเรียกมันว่าอัลกอริทึมและไม่ต้องสงสัยเลยว่านี่เป็นวิธีที่ถูกต้องที่จะทำ จากนั้นฉันสงสัยว่า "ฉันสามารถทำสิ่งนี้ในเวลาคงที่ได้หรือไม่" ซึ่งปล่อยให้แนวคิดต่อไปนี้เกิดอะไรขึ้นถ้าฉันมีอาร์เรย์ของจำนวนเต็มโดยที่อาร์เรย์ [n] เป็นบ้านของแฟคทอเรียลของ n? เมื่ออาร์เรย์นี้เต็มไปฉันสามารถนิยามข้อเท็จจริงได้ดังนี้

 int fact(int n) 
 { 
 return array[n]; 
 } 

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

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

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

เป็นตัวอย่างอื่นพิจารณาการใช้งานทั่วไปของอาร์เรย์: ฉันจัดสรรอาร์เรย์เริ่มแรกของขนาด N จากนั้นฉันเพิ่มองค์ประกอบให้กับอาร์เรย์โดยการจัดเก็บค่าที่ดัชนี n และเพิ่ม n โดยหนึ่งหน่วย จากนั้นถ้าฉันต้องการค้นหาองค์ประกอบฉันไม่สามารถช่วย แต่ทำการค้นหาเชิงเส้นมากกว่าอาร์เรย์ ถ้าฉันสร้างอาร์เรย์ขนาดแทน Integer.MAXVALUE เพื่อเก็บจำนวนเต็มเริ่มต้นด้วยศูนย์ฉันสามารถเก็บจำนวนเต็มโดยวาง 1 ที่ดัชนี จากนั้นฉันสามารถค้นหาการมีอยู่ของมันในอาร์เรย์ในเวลา O (1) ถ้าหากฉันต้องการวางหมายเลขเดียวกันหลายหน่วย ไม่มีปัญหาฉันแค่เพิ่มค่าที่เก็บไว้ในดัชนีจำนวนเต็ม

การเรียงลำดับจะซับซ้อนกว่านี้เล็กน้อย แต่อย่างไรก็ตามการค้นหาและการเพิ่มสามารถทำได้ในเวลา O (1)


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

ใช่โค้ดที่สองของคุณสามารถเรียกว่าอัลกอริทึมที่อินพุตเป็นหมายเลข n และอาร์เรย์ที่มีแฟคทอเรียลทั้งหมด ในรหัสแรกอัลกอริทึมมีเพียงหนึ่งอินพุตคือหมายเลข n
Ankur

ข้อผูกมัด: วันนี้ฉันจะไม่พยายามต่อไปเพื่อกำหนดประเภทของเนื้อหาที่ฉันเข้าใจว่าจะโอบกอดไว้ในคำอธิบายสั้น ๆ ["อัลกอริทึม"] และบางทีฉันอาจไม่เคยประสบความสำเร็จในการทำเช่นนั้นอย่างชาญฉลาด แต่ฉันรู้ว่าเมื่อฉันเห็นมันและสิ่งต่าง ๆ ที่อธิบายไว้ในโพสต์ด้านล่างไม่ใช่สิ่งนั้น
Patrick87

เกี่ยวข้องกับคำถามนี้ (แต่ไม่ตอบคำถามโดยตรง) มันน่าสนใจที่จะอ่าน "อัลกอริทึมคืออะไร" โดย Yuri Gurevich, Microsoft Research, รายงานทางเทคนิค MSR-TR-2011-116 research.microsoft.com/pubs/155608/209-3.pdf
godfatherofpolka

คุณพูดว่า: "... จะเกิดอะไรขึ้นถ้าฉันมีอาร์เรย์ของจำนวนเต็มที่อาร์เรย์ [n] เป็นตัวประกอบของ n หรือไม่เมื่ออาร์เรย์นี้เต็มแล้ว .... " คุณจะเติมอาร์เรย์ด้วยแฟคทอเรียลของจำนวนเต็มทั้งหมดได้อย่างไร อาเรย์นี้จะมีขนาดไม่ จำกัด และต้องใช้เวลาในการเติมเต็ม ดังนั้นคำถามของคุณไม่ดี
AP

คำตอบ:


9

คำนิยามอย่างไม่เป็นทางการของอัลกอริทึมในตำราเรียนที่เป็นที่นิยมมีดังนี้:

อัลกอริทึมคือ (1) ขั้นตอนการคำนวณที่กำหนดไว้อย่างดี (2) ที่รับอินพุตและ (3) สร้างเอาต์พุตบางส่วน (4) สำหรับปัญหาการคำนวณที่กำหนดไว้อย่างดี

ในกรณีแรกของคุณคุณได้เขียนอัลกอริทึมโดยที่: ปัญหาคือการหาแฟคทอเรียล (ส่วนที่ 4 ของคำจำกัดความ) ที่กำหนดให้ n เป็นอินพุต (ส่วนที่ 2 ของคำจำกัดความ) รหัสจะอธิบายการคำนวณที่จะต้องดำเนินการ ) ผลลัพธ์เป็นปัจจัย (ส่วนที่ 3 ของคำนิยาม)

ในกรณีที่สองของคุณ: ปัญหาคือการหาองค์ประกอบอาร์เรย์ที่ตำแหน่ง n (ส่วนที่ 4 ของคำจำกัดความ) ให้ n เป็นอินพุต (ส่วนที่ 3 ของคำจำกัดความ) รหัสอธิบายการคำนวณที่จะดำเนินการ (ส่วนที่ 2 ของคำนิยาม) เอาท์พุทเป็นองค์ประกอบที่ตำแหน่ง n (ส่วนที่ 1 ของคำนิยาม)

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

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


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

ขั้นตอนการคำนวณที่กำหนดไว้อย่างดีควรมีความชัดเจนว่าเป็นข้อมูลที่ จำกัด หากอาเรย์ของแฟคทอเรียลที่ไม่มีที่สิ้นสุดเป็นส่วนหนึ่งของสิ่งนี้จะไม่ถือ
Ranbir

2
มันสามารถแสดงให้เห็นได้อย่างชัดเจนว่าเป็นข้อมูลที่มี จำกัด เนื่องจาก OP ได้แสดงให้เห็นแล้ว อาร์เรย์จะเริ่มต้นได้กับแฟคทอเรียลทั้งหมด นี่คือคำอธิบายที่แน่นอน มันไม่ได้ จำกัด ขอบเขตอย่างแน่นอน ในทำนองเดียวกันมีคำอธิบายที่แน่นอนโดยไม่ถูก จำกัด {(n,n!):nN}
Yuval Filmus

คำอธิบายของอาเรย์นั้นมีความชัดเจนว่าเป็นข้อมูลที่ จำกัด แต่อาเรย์นั้นไม่
Ranbir

ฉันขอยืนยันว่าทั้งสองตัวอย่างของ OP เป็นอัลกอริทึมและไม่คำนวณแฟคทอเรียลสำหรับจำนวนเต็มทั้งหมด แต่นั่นเป็นเพียงการจู้จี้จุกจิกฉันคิดว่า
Patrick87

5

ส่วนใหญ่ในวงกว้างอัลกอริทึมคือชุดของขั้นตอนในการแก้ปัญหาได้

ใน CS ต่อไปนี้เป็นที่เข้าใจกันโดยทั่วไป / สันนิษฐานเมื่อใช้อัลกอริทึมคำ:

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

ก่อนที่ CS จะก่อตั้งขึ้นนักคณิตศาสตร์มีข้อกังวลประเภทเดียวกันกับที่คุณยกขึ้นและแนะนำคำจำกัดความที่เป็นทางการของการคำนวณเพื่อจัดการกับข้อกังวลเหล่านี้ ดังนั้นในปัจจุบันเราสามารถทำพิธีทั้งหมดของสมมติฐานข้างต้นโดยเพียงแค่พูดว่า"ขั้นตอนวิธีการเป็นขั้นตอนที่สามารถดำเนินการในเครื่องทัวริง" นี่อาจเป็นคำตอบที่ดีที่สุดสำหรับคำถามของคุณ

โปรดทราบว่าวิทยานิพนธ์ของโบสถ์ทัวริงกล่าวว่าเราคิดว่าไม่มีอัลกอริทึมที่มีประสิทธิภาพ "" ที่มีประสิทธิภาพมากกว่าเครื่องทัวริง

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

ตอนนี้เราสามารถพิจารณาการคำนวณได้ดังนี้: สำหรับแต่ละขนาดอินพุตมี TM (หรืออุปกรณ์การคำนวณอื่น ๆ ) ที่สามารถแก้ปัญหาได้ นี่เป็นคำถามที่แตกต่างกันมาก โปรดสังเกตว่า TM เดียวไม่สามารถเก็บแฟกทอเรียลของจำนวนเต็มเดียวทุกตัวเนื่องจาก TM มีคำอธิบายที่ จำกัด อย่างไรก็ตามเราสามารถสร้าง TM (หรือโปรแกรมใน C) ที่เก็บแฟคทอเรียลของตัวเลขทั้งหมดต่ำกว่า 1,000 จากนั้นเราสามารถสร้างโปรแกรมที่เก็บแฟคทอเรียลของตัวเลขทั้งหมดระหว่าง 1,000 ถึง 10,000 เป็นต้น

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

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


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

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

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

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

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

4

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

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

เมื่อกังวลเกี่ยวกับเวลาทำงานจริงในคอมพิวเตอร์จริงเราควรระวังให้มากขึ้น แต่นี่มักจะเกินขอบเขตของวิทยาศาสตร์คอมพิวเตอร์เชิงทฤษฎีขออภัย


ถ้าเรามีจุกจิกมากเราจะต้องมีความชัดเจนเกี่ยวกับความแตกต่างระหว่างขั้นตอนวิธีการและฟังก์ชั่นคำนวณโดยขั้นตอนวิธีการ ตัวอย่างเช่นฟังก์ชั่นแฟกทอเรียลได้รับการป้อนค่าเป็นจำนวนธรรมชาติและเอาต์พุต. ฟังก์ชันแฟกทอเรียลสามารถคำนวณได้โดยอัลกอริทึม เราบอกว่าฟังก์ชั่นคำนวณได้ถ้ามันสามารถคำนวณได้โดยใช้อัลกอริทึมn !nn!

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

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


3
lol "อัลกอริทึมเป็นโปรแกรมที่เขียนใน C ... "?!?
vzn

2
"อัลกอริทึมเป็นโปรแกรมที่เขียนด้วยภาษา C" ... ทำไมคุณต้องระบุภาษา มันทำให้รู้สึกไม่
นาม

1
@nouney ฉันแค่พยายามเป็นรูปธรรม ภาษาการเขียนโปรแกรมที่คุณชื่นชอบคือทัวริงที่สมบูรณ์
Yuval Filmus

@YuvalFilmus คุณไม่ได้เป็นรูปธรรมคุณสับสน
นาม

@nouney คุณยินดีที่จะเพิ่มคำตอบของคุณเอง
Yuval Filmus

4

ส่วนที่สำคัญของคำจำกัดความทั่วไปของอัลกอริทึมที่คุณขาดหายไปคือข้อมูลจำเพาะจะต้องมีขนาด จำกัดและขนาดของข้อกำหนดต้องไม่แตกต่างกันไปตามขนาดของอินพุต

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

ที่ไม่เกี่ยวข้องกับคำถามของคุณหมายใด ๆ ที่เป็นจริงของเครื่องจะมีขั้นตอนวิธีการค้นหาหน่วยความจำเป็นอย่างน้อยสามารถดึงข้อมูลหน่วยความจำที่อยู่ ดังนั้นอัลกอริทึมการค้นหาของคุณอย่างน้อยจะมีเวลาสำหรับแต่ละบิตของเอาต์พุตซึ่งมีA O ( บันทึกn ) O ( บันทึกn ! )O(logA)AO(logn)O(logn!)O(n(logn)2)sn=O(2s)O(2s s2)O(1)


" codespace จะต้องมีขอบเขต จำกัด ": คุณหมายถึงว่าโปรแกรม Lisp ที่เรียกใช้evalฟังก์ชันบนโครงสร้างข้อมูลขนาดใหญ่ที่เพิ่งสร้างขึ้นและซึ่งแสดงถึงการแสดงออกของ lLisp ไม่สามารถถือว่าเป็นอัลกอริทึมได้ ฉันสงสัยว่าโค้ดส่วนใหญ่ที่ผลิตที่ MIT ในศตวรรษที่ 20 นั้นไม่ถือว่าเป็นอัลกอริทึม นี่เป็นเพียงการถกเถียงอย่างไม่เป็นทางการ แต่ปัญหาที่เป็นทางการขึ้นอยู่กับมุมมองของข้อกำหนดที่แน่นอนซึ่งคุณอ่านด้วยวิธีที่ จำกัด มากเกินไป
babou

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

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

3

ข้อสังเกตเล็กน้อยที่อาจเป็นประโยชน์:

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

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

  1. nn!
  2. n>0n!< INT_MAXn!

การตีความบางส่วนของโค้ดแรกของคุณ:

  1. นี่คือ pseudocode ซึ่งคล้ายกับ C / C ++ ยกเว้นในรายละเอียด intตัวอย่างเช่นจริงๆหมายถึง "จำนวนเต็มใด ๆ "
  2. นี่คือการตีความราวกับว่ามันเป็นโปรแกรม C / C ++ จริง

การตีความที่ 1 นั้นถูกต้องสำหรับคำแถลงปัญหาที่ 1 ตราบใดที่แฟคทอเรียลถือว่าค่า 1 สำหรับจำนวนลบ (มิฉะนั้นเราสามารถแก้ไขคำแถลงปัญหาเพื่อ จำกัด โดเมนหรืออัลกอริทึมสำหรับบัญชีที่ต้องการพฤติกรรม) การตีความที่ 2 นั้นถูกต้องสำหรับคำแถลงปัญหาที่ 2 ด้วยข้อแม้เดียวกัน

arrayarraynn>0n!< INT_MAXn!n<0

nn!232n!264

kknknk+n


ฉันคิดว่าแนวคิดของอัลกอริทึมค่อนข้างจะเกินข้อ จำกัด ขนาดคำของคอมพิวเตอร์ ฉันรู้สึกว่าคุณกำลังหลบปัญหาอยู่
babou

1

อัลกอริทึมเป็นโปรแกรมที่เขียนในภาษาทัวริงสมบูรณ์ที่หยุดสรรพสิ่งในปัจจัยการผลิตที่ถูกต้องทั้งหมด ภาษาการเขียนโปรแกรมมาตรฐานทั้งหมดทัวริงเสร็จสมบูรณ์ คำนี้มีต้นกำเนิดมาจากการแปลภาษายุโรปของชื่อ al-Khwārizmīนักคณิตศาสตร์ชาวเปอร์เซียนักดาราศาสตร์และนักภูมิศาสตร์ซึ่งงานสร้างขึ้นจาก Brahmagupta นักคณิตศาสตร์ชาวอินเดียในศตวรรษที่ 7 ผู้แนะนำระบบตัวเลขของอินเดียสู่โลกตะวันตก

คำถามดูเหมือนจะเป็นพื้นเกี่ยวกับว่าตารางการค้นหาเป็นส่วนหนึ่งของอัลกอริทึม แน่นอน! ในตารางทัวริงเครื่อง (TM)สามารถเข้ารหัสในตารางสถานะของ TM TM สามารถเริ่มต้นเทปตามจำนวนจำกัดของข้อมูลที่เก็บไว้ในตารางการเปลี่ยนแปลง อย่างไรก็ตาม "อัลกอริทึม" ที่ไม่ทำงานบนอินพุตไม่สิ้นสุดเฉพาะอินพุต จำกัด เป็น " finite-state machines (FSM) " เล็กน้อย


3
ทำไมต้องเป็นภาษาที่สมบูรณ์ของ TUring
babou

1

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

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

การระบุปัญหาบางอย่าง

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

π

πอาจเป็นไปได้ในแง่คณิตศาสตร์เกือบทั้งหมด แต่นั่นจะต้องมีความแม่นยำมากขึ้นในคำจำกัดความ

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

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

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

อัลกอริทึมที่น่าสนใจ (หรือโปรแกรม)

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

อัลกอริทึมที่น่าสนใจคือส่วนหนึ่งของการสร้างสรรค์หลักฐานที่สร้างสรรค์ที่ได้รับปัญหามีทางออก นั่นหมายความว่าการพิสูจน์จะต้องแสดงวิธีการแก้ปัญหามากกว่าเพียงแค่พิสูจน์การมีอยู่ของมันตัวอย่างเช่นโดยความขัดแย้ง สำหรับรายละเอียดเพิ่มเติมโปรดดูที่Intuitionistic LogicและConstructivismในวิชาคณิตศาสตร์

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

เมื่อระบุพารามิเตอร์ทั้งหมดของปัญหา (ข้อมูลอินพุต) จะแจ้งให้คุณทราบถึงวิธีรับผลลัพธ์ทีละขั้นตอนที่ระบุ ตัวอย่างทั่วไปคือความละเอียดของสมการ ( อัลกอริธึมชื่อนั้นได้มาจากชื่อของนักคณิตศาสตร์ชาวเปอร์เซียMuḥammad ibn M alsā al-Khwārizm who ซึ่งศึกษาความละเอียดของสมการบางส่วน) ส่วนต่าง ๆ ของการพิสูจน์ถูกใช้เพื่อพิสูจน์ว่าค่าบางอย่างที่คำนวณในอัลกอริทึมมีคุณสมบัติบางอย่าง แต่ส่วนเหล่านี้ไม่จำเป็นต้องถูกเก็บไว้ในอัลกอริทึมเอง

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

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

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

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

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

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

21000

โปรแกรมอะไรที่น่าสนใจ

การสนทนานี้ควรเชื่อมโยงอย่างเหมาะสมกับผลลัพธ์เช่น Curry-Howard isomorphismระหว่างโปรแกรมและการพิสูจน์ หากโปรแกรมใด ๆ เป็นหลักฐานของบางสิ่งบางอย่างโปรแกรมใด ๆ อาจถูกตีความว่าเป็นโปรแกรมที่น่าสนใจในแง่ของคำนิยามข้างต้น

อย่างไรก็ตามเพื่อความเข้าใจของฉัน (จำกัด ), มอร์ฟิซึ่มส์นี้ จำกัด เฉพาะโปรแกรมที่สามารถพิมพ์ได้ดีในระบบการพิมพ์ที่เหมาะสมซึ่งประเภทนั้นสอดคล้องกับข้อเสนอของทฤษฎีสัจพจน์ ดังนั้นโปรแกรมทั้งหมดจึงไม่สามารถถือว่าเป็นโปรแกรมที่น่าสนใจ ฉันเดาว่ามันเป็นในแง่ที่ว่าอัลกอริทึมควรจะแก้ปัญหา

สิ่งนี้อาจยกเว้นโปรแกรม "ที่สร้างแบบสุ่ม" ส่วนใหญ่

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

แต่ก็เป็นที่รู้จักกันว่าโปรแกรมไม่ทั้งหมดจะ typeable เพราะมันเป็นที่รู้จักกันว่าบางแสดงออกแลมบ์ดาเช่นการดำเนินการCombinator Y , ไม่สามารถพิมพ์ลงในระบบประเภทเสียง

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

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


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

ใช่ฉันไม่แน่ใจว่าสิ่งที่มี downvotes
นามแฝง

@ นามแฝงในกรณีของฉัน ฉันคิดว่าฉันรู้. มันสงสัยว่าเป็นการต่อสู้แบบเก่าระหว่าง semanticists และ algorithmicians โดยเฉพาะผู้ที่ทำงานด้านการคำนวณ นั่นคือการต่อสู้ระหว่างปรัชญาและธุรกิจสิ่งที่เป็นและสิ่งที่มีค่าใช้จ่าย ฉันสนใจอัลกอริทึมที่ "มีความหมาย" ฉันแก้ไขตามนั้น (แต่ฉันอยู่ที่ความรู้ของฉันซึ่งดูเหมือนจะยังดีกว่าส่วนใหญ่) คุณอาจทุกข์ทรมานจากความตกตะลึงเดียวกัน - - - อย่างไรก็ตาม เป็นที่ชัดเจนว่าในหัวข้อที่ละเอียดอ่อนนี้ใครก็ตามที่ความเห็นมีค่าเกินครึ่งเซ็นต์ก็จะไม่ฝันถึงการ downvoting โดยไม่มีคำอธิบายที่เหมาะสม
babou

หลังจากอ่านทั้งคำถามและคำตอบของคุณแล้วฉันก็ถูกลดระดับลงเพราะมันไม่ได้เน้นที่คำถามจริงและมีความคิดที่ยังไม่เสร็จมากเกินไป นอกจากนี้ฉันไม่คิดว่า "การแก้ปัญหา" เป็นส่วนที่ขาดหายไปในนิยามของอัลกอริทึม แต่ฉันยอมรับว่า "ความหมาย" ไม่ควรเพิกเฉยในคำจำกัดความของสิ่งที่ถือเป็นอัลกอริทึม
Thomas Klimpel

@ThomasKlimpel อย่างที่ฉันบอกไปฉันไม่ชำนาญเรื่องปัญหาจริง และฉันก็เสริมว่าไม่มีคำตอบอื่น ๆ การสร้างอัลกอริทึมนั้นไม่เหมือนกับความเข้าใจในสิ่งที่พวกเขาทำ การรับรู้ของฉันเกี่ยวกับความรู้ที่ จำกัด ของฉันซึ่งมันจะไม่เป็นวิทยาศาสตร์ในการซ่อนคือแหล่งที่มาของความรู้สึกที่ยังไม่เสร็จนี้ ดูเหมือนจะเป็นการดีกว่าที่จะเน้นการมีอยู่ของปัญหาแทนที่จะมองข้ามพวกเขา ฉันพูดถึงแต่ละตัวอย่างมากกว่าจากซีแมนทิกส์ POV มากกว่าจากอัลกอริทึมเนื่องจากคำถามคือคำถามเซแมนทิค ("อะไรคือ ... ?") คุณคิดว่าคำตอบอื่น ๆ นำมาซึ่งความเข้าใจอย่างเป็นทางการหรือไม่ แสดงความคิดเห็นของฉัน
babou

0

ไม่มีคำนิยามอย่างเป็นทางการที่ดีของ "อัลกอริทึม" ในขณะที่เขียน อย่างไรก็ตามมีคนฉลาดทำงานอยู่

สิ่งที่เรารู้คืออะไรก็ตามที่ "อัลกอริทึม" มันอยู่ที่ไหนสักแห่งระหว่าง "ฟังก์ชันคณิตศาสตร์" และ "โปรแกรมคอมพิวเตอร์"

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

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

ในทำนองเดียวกันมีคลาสที่เท่าเทียมกันระหว่างอัลกอริธึมโดยที่อัลกอริธึมสองอันนั้นเทียบเท่ากันหากพวกเขาคำนวณฟังก์ชันทางคณิตศาสตร์ที่เหมือนกัน

ส่วนที่ยากในการพยายามจับสิ่งที่เราหมายถึงโดย "สิ่งเดียวกัน"

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

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


1
ฉันไม่คิดว่ามันยุติธรรมที่จะบอกว่าไม่มีคำจำกัดความที่เป็นทางการที่ดีของอัลกอริทึม กรณีนี้เกิดขึ้นเมื่อประมาณ 100 ปีที่แล้ว
Juho

1
@Juho มันอาจเป็นได้ว่านามแฝงทำให้มันฟังดูแรงเกินไปแม้ว่าเขาจะพยายามที่จะบรรเทาคำสั่งโดยเฉพาะอย่างยิ่งว่าสถานการณ์กำลังดำเนินการอยู่ อย่างไรก็ตามฉันคิดว่าเขาค่อนข้างถูกต้องในการประเมินของเขา ฉันมีปฏิกิริยาช้าเพราะฉันใช้เวลากับเรื่องนี้มากและรู้สึกเหมือนกันมาก ผู้คนพัฒนาความเข้าใจของพวกเขาได้ดีขึ้นมาก แต่การสนทนาทั้งหมดแสดงให้เห็นว่าไม่มีฉันทามติที่แท้จริง ... และฉันพบว่าการมีส่วนร่วมที่ยังไม่บรรลุนิติภาวะอย่างมากเนื่องจากระดับของผู้คนที่เกี่ยวข้อง ถ้าเขาไม่ยุติธรรมคุณคิดว่าใครให้คำนิยามที่เป็นทางการที่ดี?
babou

คุณถูกต้อง 100% และฉันคิดว่าถ้าทัวริงงัวอยู่หรือทฤษฎีอื่น ๆ ในทฤษฎีความซับซ้อนเขาจะ 100% เห็นด้วยกับคุณ นักวิชาการจำเป็นต้องละทิ้งศาสนาของพวกเขา มันเป็นอุปสรรคต่อสนาม สิ่งนี้จะเกิดขึ้นในที่สุดเมื่อพวกเขาตาย ขอบคุณพระเจ้าสำหรับสิ่งนั้น
EnjoysMath

-4

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

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


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