คุณเคยสงสัยหรือไม่: อุปกรณ์ที่คุณกำลังอ่านบทความนี้คืออะไร? คอมพิวเตอร์คืออะไร? วิทยาการคอมพิวเตอร์ย้อนกลับไปได้นานก่อนที่จะมีการนึกถึงอุปกรณ์คอมพิวเตอร์สมัยใหม่เหล่านี้ ในอุตสาหกรรมที่คำถามที่พบบ่อยมากที่สุดเกี่ยวกับภาษาโปรแกรมเฟรมเวิร์กและไลบรารีเรามักจะใช้แนวคิดพื้นฐานที่ทำให้คอมพิวเตอร์ทำงานได้
แต่คอมพิวเตอร์เหล่านี้ซึ่งดูเหมือนจะมีศักยภาพไม่สิ้นสุด - มีข้อ จำกัด หรือไม่? มีปัญหาที่คอมพิวเตอร์ไม่สามารถแก้ไขได้หรือไม่?
ในบทความนี้เราจะตอบคำถามเหล่านี้โดยย้ายออกจากรายละเอียดของภาษาโปรแกรมและสถาปัตยกรรมคอมพิวเตอร์ ด้วยการทำความเข้าใจพลังและข้อ จำกัด ของคอมพิวเตอร์และอัลกอริทึมเราสามารถปรับปรุงวิธีคิดและเหตุผลที่ดีขึ้นเกี่ยวกับกลยุทธ์ต่างๆ
มุมมองที่เป็นนามธรรมของการคำนวณทำให้เกิดผลลัพธ์ที่ได้รับการทดสอบของเวลาและมีคุณค่าสำหรับเราในปัจจุบันเช่นเดียวกับที่พวกเขาได้รับการพัฒนาครั้งแรกในปี 1970
ในโรงเรียนเรามักจะได้รับการสอนแบบจำลองทางจิตใจของปัญหาและหน้าที่ที่กล่าวว่า:
ฟังก์ชันคือโพรซีเดอร์ที่คุณใช้กับอินพุต x เพื่อค้นหาเอาต์พุต f (x)
ปรากฎว่าไฟล์ นิยามทางคณิตศาสตร์ แตกต่างกัน:
ฟังก์ชันคือชุดของคู่ที่เรียงลำดับเพื่อให้องค์ประกอบแรกของแต่ละคู่มาจากเซต X (เรียกว่าโดเมน) องค์ประกอบที่สองของแต่ละคู่มาจากเซต Y (เรียกว่าโดเมนร่วมหรือช่วง) และแต่ละองค์ประกอบ ของโดเมนจับคู่กับองค์ประกอบเดียวของช่วง
แค่นั้นก็เพียงพอแล้ว แต่นั่นหมายความว่าอย่างไร?
คำจำกัดความนี้บอกเราว่าคอมพิวเตอร์เป็นเครื่องจักรสำหรับการทำงานของคอมพิวเตอร์
ทำไม?
เนื่องจากคอมพิวเตอร์แปลงอินพุตโดยพลการเป็นเอาต์พุตบางอย่าง กล่าวอีกนัยหนึ่งคือพวกเขาแก้ปัญหา คำจำกัดความของฟังก์ชันสองคำคือคำจำกัดความที่เรารู้จักเป็นอย่างดีและคำที่เป็นทางการนั้นตรงกันสำหรับวัตถุประสงค์ในทางปฏิบัติหลายประการ
อย่างไรก็ตามคำจำกัดความทางคณิตศาสตร์ช่วยให้เราสามารถบรรลุข้อสรุปที่น่าสนใจเช่นการมีอยู่ของฟังก์ชันที่ไม่สามารถประมวลผลได้ (นั่นคือปัญหาที่ไม่มีทางแก้ไข):
เหตุใดจึงไม่สามารถอธิบายฟังก์ชันทั้งหมดเป็นอัลกอริทึมได้
เพื่อช่วยในการโต้แย้งของเราลองจินตนาการว่าคอมพิวเตอร์เป็นเครื่องจักรที่มีอินพุตดำเนินการตามลำดับและหลังจากนั้นสักครู่ก็ให้เอาต์พุต
ขอเรียกตัวอักษรของเครื่องป้อนข้อมูลซึ่งเป็นชุดของลำดับอักขระจากชุด จำกัด บางชุด ตัวอย่างเช่นตัวอักษรของเครื่องอาจเป็นเลขฐานสอง (0 และ 1s) หรืออาจเป็นชุดอักขระ ASCII ลำดับที่ จำกัด ของอักขระเป็นสตริง - ตัวอย่างเช่น '0110'
นอกจากนี้เราจะแสดงผลลัพธ์ของเครื่องเป็นไบนารียอมรับและปฏิเสธการตัดสินใจที่ส่งมอบเมื่อเครื่อง (หวังว่า) ทำการคำนวณเสร็จสิ้น สิ่งที่เป็นนามธรรมนี้เข้ากันได้ดีกับนิยามทางคณิตศาสตร์ของฟังก์ชันข้างต้น
เมื่อพิจารณาจากพารามิเตอร์เหล่านี้สิ่งสำคัญคือต้องระบุลักษณะอีกหนึ่งประเภท: ชุดของสตริงอักขระ บางทีเราอาจกังวลกับชุดของสตริงที่เครื่องยอมรับหรือบางทีเรากำลังสร้างเครื่องที่รับสตริงในชุดหนึ่งไม่ใช่ชุดอื่นหรือบางทีเราอาจถามว่าเป็นไปได้ไหมที่จะออกแบบเครื่องที่ยอมรับทั้งหมดในบางชุด ชุดเฉพาะและไม่ใช่ในชุดอื่น ๆ
ในกรณีเหล่านี้ชุดของสตริงอักขระเรียกว่าภาษา - ตัวอย่างเช่นชุดของสตริงไบนารีทั้งหมดที่แสดงถึงตัวเลขคู่หรือชุดของสตริงที่มีจำนวนอักขระคู่ ปรากฎว่าภาษาต่างๆเช่นตัวเลขสามารถเป็นได้ ซื้อขายกับผู้ประกอบการ เช่นการเรียงต่อกันการรวมกันการตัดกันและสิ่งที่คล้ายกัน
ตัวดำเนินการที่สำคัญคือตัวดำเนินการ Kleene star ซึ่งใช้กับนิพจน์ทั่วไปเช่นกัน สิ่งนี้ถือได้ว่าเป็นการรวมพลังของภาษาที่เป็นไปได้ทั้งหมด เช่นถ้าภาษาของเรา ถึง คือชุดของสตริงอักขระ {'01', '1'} จากนั้นเป็นสมาชิกของ ถึง* คือสตริงอักขระ '0101111'
ปริศนาชิ้นสุดท้ายก่อนที่จะพิสูจน์คำกล่าวอ้างของเราว่าไม่ใช่ทุกฟังก์ชันที่คำนวณได้คือแนวคิดของการบัญชี โดยสัญชาตญาณการทดสอบของเราจะแสดงให้เห็นว่ามีภาษาเพิ่มเติม นั่นคือปัญหามากกว่าโปรแกรมที่เป็นไปได้ในการแก้ไข สิ่งนี้ใช้ได้เนื่องจากปัญหาที่ว่าสตริงอักขระเป็นของภาษา (ใช่ / ไม่ใช่) นั้นเป็นปัญหาหรือไม่
อย่างแม่นยำยิ่งขึ้นการทดสอบของเราระบุว่าชุดของโปรแกรมที่เป็นไปได้นั้นสามารถนับได้อย่างไม่มีที่สิ้นสุดในขณะที่ชุดของภาษาบนตัวอักษรนั้นนับไม่ถ้วน
ณ จุดนี้คุณอาจกำลังคิดว่า 'Infinity เป็นความคิดที่แปลกมากในตัวของมันเองตอนนี้ฉันมีสองสิ่งที่ต้องจัดการ!'
ก็ไม่เลวร้ายเท่าไหร่ เซตที่นับไม่ถ้วนคือเซตที่สามารถแจกแจงได้ เป็นไปได้ที่จะพูดว่า: นี่คือองค์ประกอบแรกนี่คือองค์ประกอบที่สองและอื่น ๆ ในที่สุดก็กำหนดตัวเลขให้กับแต่ละองค์ประกอบในชุด ยกตัวอย่างชุดของเลขคู่ เราสามารถพูดได้ว่า 2 คือตัวแรก 4 ตัวที่สอง 6 ตัวที่สามและอื่น ๆ ชุดดังกล่าวนับได้ไม่สิ้นสุดหรือนับได้
อย่างไรก็ตามในบางชุดเช่นจำนวนจริงไม่สำคัญว่าคุณจะฉลาดแค่ไหน ไม่มีการแจงนับ ชุดเหล่านี้คือ ไม่มีที่สิ้นสุดนับไม่ถ้วน หรือนับไม่ได้
ก่อนอื่นเราต้องการแสดงให้เห็นว่าชุดโปรแกรมคอมพิวเตอร์นั้นสามารถนับได้ สำหรับวัตถุประสงค์ของเราเราทำสิ่งนี้โดยสังเกตว่าชุดของสตริงอักขระทั้งหมดบนตัวอักษร จำกัด นั้นสามารถนับได้ ใช้งานได้เนื่องจากโปรแกรมคอมพิวเตอร์เป็นสตริงอักขระที่ จำกัด
หลักฐาน ตรงไปตรงมาและเราไม่ได้กล่าวถึงรายละเอียดที่นี่ ประเด็นสำคัญคือมีโปรแกรมคอมพิวเตอร์จำนวนมากเช่นตัวเลขธรรมชาติ
เพื่อย้ำ:
หลักการออกแบบข้อใดต่อไปนี้ทำให้คุณสามารถรวมเพจได้
ชุดของสตริงอักขระทั้งหมดบนตัวอักษรใด ๆ (เช่นชุดโปรแกรมคอมพิวเตอร์ทั้งหมด) สามารถนับได้
จากข้อสรุปนี้แล้วส่วนย่อยของสตริงอักขระเหล่านี้ล่ะ? ถามอีกอย่างชุดภาษาทั้งหมดล่ะ ปรากฎว่าชุดนี้นับไม่ได้
ชุดของภาษาทั้งหมดบนตัวอักษรใด ๆ นั้นนับไม่ได้
อีกครั้งเราไม่ครอบคลุม หลักฐาน ที่นี่.
แม้ว่าอาจจะไม่ปรากฏชัดเจนในทันที แต่ผลที่ตามมาของภาษานับไม่ถ้วนและการบัญชีของโปรแกรมคอมพิวเตอร์ทั้งหมดนั้นลึกซึ้งมาก
ทำไม?
สมมุติ ถึง คือชุดอักขระ ASCII ที่ อักขระ ASCII มีความจำเป็นในการเขียนโปรแกรมคอมพิวเตอร์เท่านั้น เราจะเห็นว่าชุดของสตริงที่แสดงถึงตัวอย่างเช่นโปรแกรม JavaScript เป็นชุดย่อยของ ถึง* (ที่นี่ * คือผู้ดำเนินรายการดาราของ Kleene) การเลือกใช้ JavaScript เป็นไปตามอำเภอใจ เนื่องจากชุดโปรแกรมนี้เป็นชุดย่อยของชุดที่นับได้เราจึงสามารถนับชุดโปรแกรม JavaScript ได้
นอกจากนี้ให้เราพิจารณาว่าสำหรับภาษาใด ๆ ล เราสามารถกำหนดฟังก์ชันบางอย่างได้ ฉ ซึ่งประเมินเป็น 1 ถ้าสตริงใด ๆ x มันอยู่ใน ล และ 0 มิฉะนั้น ฟังก์ชันทั้งหมดนั้นแตกต่างกัน เนื่องจากมีความสอดคล้องแบบ 1: 1 กับชุดของภาษาทั้งหมดและเนื่องจากชุดของภาษาทั้งหมดนั้นนับไม่ได้เราจึงมีชุดของฟังก์ชันทั้งหมดนี้นับไม่ได้
นี่คือประเด็นในเชิงลึก:
เนื่องจากชุดของโปรแกรมที่ถูกต้องทั้งหมดสามารถนับได้ แต่ชุดของฟังก์ชันไม่ได้จึงต้องมีฟังก์ชันบางอย่างที่เราไม่สามารถเขียนโปรแกรมได้
เรายังไม่รู้ว่าคุณลักษณะหรือปัญหาเหล่านี้มีลักษณะอย่างไร แต่เราทราบว่ามีอยู่จริง นี่เป็นความสำนึกที่ต่ำต้อยเพราะมีปัญหาบางอย่างที่ไม่มีทางแก้ไข เราถือว่าคอมพิวเตอร์มีประสิทธิภาพและความสามารถสูงมาก แต่บางสิ่งก็ไม่สามารถเข้าถึงได้
เทคโนโลยีในสงครามเย็น
คำถามคือ: 'ปัญหาเหล่านี้เป็นอย่างไร' ก่อนที่จะอธิบายปัญหาเหล่านี้ต่อไปเราต้องสร้างแบบจำลองการคำนวณในลักษณะทั่วไปก่อน
หนึ่งในแบบจำลองทางคณิตศาสตร์เครื่องแรกที่พัฒนาโดย Alan Turing รุ่นนี้เรียกว่าเครื่องทัวริงเป็นอุปกรณ์ที่เรียบง่ายอย่างยิ่งที่จับแนวคิดเรื่องความสามารถในการคำนวณของเราได้อย่างสมบูรณ์
อินพุตไปยังเครื่องเป็นเทปที่มีการเขียนอินพุต การใช้หัวอ่าน / เขียนเครื่องจะแปลงอินพุตเป็นเอาต์พุตตามขั้นตอนต่างๆ ในแต่ละขั้นตอนจะมีการตัดสินใจว่าจะเขียนอะไรลงบนเทปและจะเลื่อนไปทางขวาหรือทางซ้าย การตัดสินใจนี้ขึ้นอยู่กับสองสิ่ง:
สัญลักษณ์ปัจจุบันใต้หัวและ
สถานะภายในของเครื่องซึ่งจะอัปเดตเมื่อพิมพ์สัญลักษณ์
นั้นคือทั้งหมด.
ในปีพ. ศ. 2469 อลันทัวริงไม่เพียง แต่พัฒนาเครื่องจักรทัวริงเท่านั้น แต่ยังมีแนวคิดที่สำคัญหลายประการเกี่ยวกับลักษณะของการคำนวณเมื่อเขาเขียนบทความที่มีชื่อเสียงของเขาเรื่อง 'On Computable Numbers' เขาตระหนักว่าโปรแกรมคอมพิวเตอร์อาจถูกมองว่าเป็นข้อมูลเข้าสู่คอมพิวเตอร์ ด้วยมุมมองนี้เขามีความคิดที่สวยงามว่าเครื่องทัวริงสามารถจำลองหรือดำเนินการป้อนข้อมูลนั้นได้
แม้ว่าเราจะรับแนวคิดเหล่านี้ในวันนี้ แต่ในสมัยของ Turing แนวคิดเรื่องเครื่องจักรสากลดังกล่าวเป็นความก้าวหน้าที่ทำให้ Turing สามารถพัฒนาปัญหาที่แก้ไม่ได้
ก่อนที่จะดำเนินการต่อเรามาตรวจสอบประเด็นสำคัญ: เรารู้ว่าเครื่องทัวริงเป็นแบบจำลองของการคำนวณ แต่มันทั่วไปเพียงพอหรือไม่? เพื่อตอบคำถามนี้เราหันไป วิทยานิพนธ์ Church-Turing ซึ่งให้ความน่าเชื่อถือต่อข้อความต่อไปนี้:
ทุกสิ่งที่คำนวณได้นั้นสามารถคำนวณได้โดยเครื่องทัวริง
ในขณะที่ทัวริงพัฒนาเครื่องทัวริงเป็นแบบจำลองของการคำนวณ Alonzo Church ยังได้พัฒนาแบบจำลองแคลคูลัสที่เรียกว่าแลมบ์ดา - แคลคูลัส แบบจำลองเหล่านี้มีประสิทธิภาพในการอธิบายถึงการคำนวณและทำในลักษณะที่เหมือนกันสำหรับคอมพิวเตอร์ในปัจจุบันหรือสำหรับคอมพิวเตอร์ทุกเครื่อง ซึ่งหมายความว่าเราสามารถใช้เครื่องทัวริงเพื่ออธิบายปัญหาที่ไม่สามารถแก้ไขได้ที่เราแสวงหาโดยรู้ว่าการค้นพบของเราจะนำไปใช้กับคอมพิวเตอร์ทุกเครื่องที่เป็นไปได้
เราจำเป็นต้องครอบคลุมความลึกอีกเล็กน้อยก่อนที่จะอธิบายอย่างเป็นรูปธรรมเกี่ยวกับปัญหาที่แก้ไขไม่ได้กล่าวคือแนวคิดของเครื่องมือจดจำภาษาและปัจจัยในการตัดสินใจภาษา
ภาษาเป็นที่รู้จักหากมีเครื่องทัวริงที่จำได้
ย
ภาษาสามารถตัดสินใจได้หากมีเครื่องทัวริงที่ตัดสินใจได้
ในการเป็นผู้จดจำภาษาเครื่องทัวริงต้องยอมรับอักขระทุกตัวในภาษาและต้องไม่ยอมรับสิ่งที่ไม่อยู่ในภาษา คุณสามารถปฏิเสธหรือทำซ้ำสตริงเหล่านั้นได้ เพื่อเป็นปัจจัยในการตัดสินใจเครื่องทัวริงต้องหยุดการป้อนข้อมูลโดยการยอมรับหรือปฏิเสธเสมอ
ที่นี่แนวคิดในการหยุดการเข้าเป็นสิ่งสำคัญ ในความเป็นจริงเราเห็นว่าปัจจัยการตัดสินใจมีพลังมากกว่าตัวรับรู้ นอกจากนี้ปัญหาสามารถแก้ไขได้หรือใช้วิธีอื่นฟังก์ชันจะตัดสินใจได้ก็ต่อเมื่อมีเครื่องทัวริงที่ตัดสินภาษาที่อธิบายโดยฟังก์ชัน
หากคุณเคยเขียนโปรแกรมคอมพิวเตอร์มาก่อนแน่นอนว่าคุณต้องรู้ว่าการได้นั่งอยู่ที่นั่นรู้สึกอย่างไรเพียงแค่ดูคอมพิวเตอร์หมุนวงล้อเมื่อโปรแกรมกำลังทำงาน ไม่ทราบว่าโปรแกรมใช้เวลานานหรือมีข้อผิดพลาดบางอย่างในโค้ดที่ทำให้เกิดการวนซ้ำแบบไม่สิ้นสุด คุณอาจสงสัยด้วยซ้ำว่าทำไมคอมไพเลอร์ไม่ตรวจสอบโค้ดเพื่อดูว่ามันจะหยุดหรือทำซ้ำตลอดไปเมื่อมันทำงาน
คอมไพลเลอร์ไม่มีการควบคุมดังกล่าวเนื่องจากไม่สามารถทำได้ ไม่ใช่ว่าวิศวกรรวบรวมข้อมูลไม่ฉลาดพอหรือขาดทรัพยากร แต่เป็นไปไม่ได้ที่จะตรวจสอบโปรแกรมคอมพิวเตอร์โดยพลการเพื่อตรวจสอบว่าหยุดทำงานหรือไม่
เราสามารถทดสอบได้โดยใช้เครื่องทัวริง เครื่องทัวริงสามารถอธิบายได้ว่าเป็นสตริงอักขระดังนั้นจึงมีจำนวนที่นับได้ สมมติว่ามหนึ่ง, ม2และอื่น ๆ ประกอบเป็นชุดของเครื่องทัวริงทั้งหมด เราจะกำหนดฟังก์ชันต่อไปนี้:
f (i, j) = 1 si มผมคุณยอมรับนี่คือไวยากรณ์สำหรับ 'การเข้ารหัสสตริงของ M' และฟังก์ชันนี้แสดงถึงปัญหาในการสร้าง 1 ถ้า Mผมหยุดเมื่อยอมรับ Mญเป็นอินพุตและเอาต์พุต 0 ในทางตรงกันข้าม สังเกตว่า Mผมต้องหยุด (เช่นเป็นตัวทำลายข้อตกลง) สิ่งนี้จำเป็นเนื่องจากเราต้องการอธิบายฟังก์ชันที่ไม่สามารถตัดสินใจได้ (นั่นคือปัญหาที่ไม่มีทางแก้ไข)
ตอนนี้เรามากำหนดภาษากัน ล ซึ่งประกอบด้วยการเข้ารหัสสตริงของเครื่องทัวริงที่ไม่ยอมรับคำอธิบายของตัวเอง:
L =เช่นบางเครื่อง Mหนึ่งสามารถส่งออก 0 สำหรับอินพุต
มลคุณยอมรับ
ล> หรือ
มลปฏิเสธ
ล>
ศรีมลยอมรับการเข้ารหัสของตัวเองนั่นหมายความว่า
ในทั้งสองกรณีเรามีความขัดแย้งหรือในแง่คณิตศาสตร์ความขัดแย้งซึ่งแสดงให้เห็นว่าภาษา L นั้นไม่สามารถตัดสินใจได้ ดังนั้นเราจึงได้อธิบายปัญหาแรกที่แก้ไขไม่ได้ของเรา
แม้ว่าปัญหาที่เราเพิ่งอธิบายไปอาจดูเหมือนไม่เกี่ยวข้อง แต่ก็สามารถลดลงเป็นปัญหาที่ไม่สามารถแก้ไขได้เพิ่มเติมซึ่งมีความสำคัญในทางปฏิบัติโดยเฉพาะอย่างยิ่ง ปัญหาการกักขัง :
ภาษาของการเข้ารหัสเครื่องทัวริงที่หยุดอยู่บนสตริงว่าง
ปัญหาการหยุดใช้กับคำถามที่ว่าทำไมคอมไพเลอร์ไม่สามารถตรวจจับนอตที่ไม่มีที่สิ้นสุดได้ตั้งแต่เนิ่นๆ หากเราไม่สามารถระบุได้ว่าโปรแกรมลงท้ายด้วยสตริงว่างหรือไม่เราจะทราบได้อย่างไรว่าการทำงานของโปรแกรมจะทำให้เกิดปมที่ไม่มีที่สิ้นสุดหรือไม่? ณ จุดนี้อาจดูเหมือนว่าเรากำลังโบกมือเพื่อหาข้อสรุปง่ายๆ แต่เราก็ตระหนักว่าไม่มีเครื่องทัวริงใดสามารถบอกได้ว่าโปรแกรมคอมพิวเตอร์จะหยุดทำงานหรืออยู่ในปมตลอดไป นี่เป็นปัญหาสำคัญสำหรับการใช้งานจริงและไม่สามารถแก้ไขได้บนเครื่องทัวริงหรือคอมพิวเตอร์ประเภทอื่น ๆ iPhone ไม่สามารถแก้ปัญหานี้ได้ เดสก์ท็อปที่มีคอร์จำนวนมากไม่สามารถแก้ปัญหานี้ได้ ระบบคลาวด์ไม่สามารถแก้ปัญหานี้ได้ แม้ว่าใครบางคนต้องการประดิษฐ์คอมพิวเตอร์ควอนตัม แต่พวกเขาก็ยังไม่สามารถแก้ปัญหาการหยุดชะงักได้
ในการตรวจสอบทฤษฎีความสามารถในการคำนวณของเราเราได้เห็นว่ามีฟังก์ชันมากมายที่ไม่สามารถคำนวณได้ในความหมายทั่วไปของคำโดยการโต้แย้งการนับ เรากำหนดสิ่งที่เราหมายถึงอย่างแม่นยำโดยการคำนวณย้อนกลับไปที่แรงบันดาลใจของทัวริงจากประสบการณ์ของเขาเองเกี่ยวกับดินสอและกระดาษเพื่อทำให้เครื่องทัวริงเป็นทางการ เราได้เห็นว่าแบบจำลองนี้สามารถคำนวณอะไรก็ได้ที่คอมพิวเตอร์ปัจจุบันหรือที่วางแผนไว้สำหรับวันพรุ่งนี้สามารถทำได้และเราได้ตระหนักถึงปัญหาระดับหนึ่งที่ไม่สามารถคำนวณได้เลย
ถึงกระนั้นความสามารถในการคำนวณก็มีข้อเสีย เพียงเพราะเราสามารถแก้ปัญหาได้ไม่ได้หมายความว่าเราจะแก้ปัญหาได้อย่างรวดเร็ว ท้ายที่สุดแล้วคอมพิวเตอร์จะมีประโยชน์อะไรหากการคำนวณของมันจะไม่เสร็จสิ้นก่อนที่ดวงอาทิตย์จะเปลี่ยนโนวามาอยู่เหนือเราหลายสิบล้านปีในอนาคต?
ทิ้งฟังก์ชันและภาษาที่คำนวณได้ไว้เบื้องหลังตอนนี้เราจะพูดถึงความซับซ้อนของการคำนวณการตรวจสอบการคำนวณที่มีประสิทธิภาพและ P vs. NP.
นักวิทยาศาสตร์คอมพิวเตอร์ตระหนักถึงปัญหาที่หลากหลายและสองคลาสที่สำคัญสำหรับเรา ได้แก่ ปัญหาที่คอมพิวเตอร์สามารถแก้ไขได้อย่างรวดเร็วหรือมีประสิทธิภาพซึ่งเรียกว่า ป และปัญหาที่สามารถตรวจสอบแนวทางแก้ไขได้อย่างรวดเร็ว แต่ไม่สามารถรับได้อย่างรวดเร็วเรียกว่า ตัวอย่างเช่น .
ตัวอย่างเช่นสมมติว่าคุณมีหน้าที่รับผิดชอบในการพัฒนาอัลกอริทึมสำหรับบริการหาคู่ออนไลน์และมีคนถามคำถามว่า 'ทุกคนหาคู่ได้ไหม' คำตอบมาจากการจับคู่บุคคลที่เข้ากันได้เพื่อให้ทุกคนจับคู่กัน ปรากฎว่ามีอัลกอริทึมที่มีประสิทธิภาพในการแก้ปัญหานี้ ปัญหานี้อยู่ในชุด ป .
ถ้าเราต้องการระบุความเป็นพี่น้องที่ใหญ่ที่สุดในหมู่ผู้ใช้ของเราล่ะ? ตามความเป็นพี่น้องกันเราหมายถึงเครือข่ายที่ใหญ่ที่สุดของบุคคลที่เข้ากันได้ เมื่อจำนวนผู้ใช้น้อยปัญหานี้สามารถแก้ไขได้อย่างรวดเร็ว เราสามารถระบุได้อย่างง่ายดายเช่นกิลด์ที่มีผู้ใช้ 3 คน อย่างไรก็ตามเมื่อเราเริ่มค้นหาชมรมที่ใหญ่ขึ้นปัญหาก็ยากที่จะแก้ไขมากขึ้น ปัญหานี้อยู่ในชุด ตัวอย่างเช่น .
ป คือชุดของปัญหาที่สามารถแก้ไขได้ในเวลาพหุนาม นั่นคือจำนวนขั้นตอนการคำนวณถูก จำกัด โดยฟังก์ชันพหุนามที่เกี่ยวข้องกับขนาดของปัญหา เรารู้ดีว่าคำถาม“ ทุกคนเดทกันได้ไหม” หรือที่เรียกว่า ปัญหาความบังเอิญสองฝ่าย มันอยู่ใน ป .
ตัวอย่างเช่น คือชุดของปัญหาที่ตรวจสอบได้ในเวลาพหุนาม ซึ่งรวมถึงปัญหาทั้งหมดใน P แน่นอน; อย่างไรก็ตามเราไม่รู้ว่าการกักกันนี้เข้มงวดหรือไม่ เราทราบถึงปัญหาที่ตรวจสอบได้อย่างมีประสิทธิภาพ แต่ไม่สามารถแก้ไขได้อย่างมีประสิทธิภาพ แต่เราไม่รู้ว่าปัญหานั้นไม่ละลายน้ำจริงหรือไม่ ปัญหาพี่น้องเป็นหนึ่งในปัญหานั้น เรารู้ว่าเราสามารถตรวจสอบวิธีแก้ปัญหาได้อย่างมีประสิทธิภาพ แต่เราไม่ทราบแน่ชัดว่าเราสามารถแก้ปัญหาได้อย่างมีประสิทธิภาพหรือไม่
โดยล่าสุด NP- สมบูรณ์ เป็นชุดของปัญหาที่เป็นปัญหาที่ยากที่สุดใน ตัวอย่างเช่น . เรียกได้ว่าเป็นสิ่งที่ยากที่สุดเพราะปัญหาใด ๆ ตัวอย่างเช่น สามารถเปลี่ยนเป็นไฟล์ NPC . เป็นผลให้หากมีคนระบุวิธีแก้ปัญหาที่มีประสิทธิภาพใน NPC ทุกประเภท ตัวอย่างเช่น จะถูกดูดซึมโดย ป . ปัญหาความเป็นพี่น้องก็เข้ามา NPC
ดังนั้นเรามาถึงปัญหาของ ป ต่อต้าน ตัวอย่างเช่น . นักวิทยาศาสตร์คอมพิวเตอร์และนักคณิตศาสตร์หลายคนเชื่ออย่างนั้น ป ย ตัวอย่างเช่น พวกเขาไม่เหมือนกัน หากเป็นเช่นนั้นความหมายจะลึกซึ้งเกินกว่าเหตุ โครงสร้างพื้นฐานดิจิทัลส่วนใหญ่ในปัจจุบันขึ้นอยู่กับความจริงที่ว่ามีปัญหาใน ตัวอย่างเช่น ที่ไม่ได้อยู่ใน ป . หากไม่เป็นเช่นนั้นวิธีการเข้ารหัสจะพังทลายลงในชั่วข้ามคืนทำให้ผู้ที่มีวิธีแก้ปัญหาอย่างมีประสิทธิภาพ NPC สามารถล้มล้างแม้แต่โปรโตคอลความปลอดภัยที่เข้มงวดที่สุด
สำหรับมือใหม่ด้านคอมพิวเตอร์ความแตกต่างระหว่างการจับคู่กับปัญหากิลด์ดูเหมือนจะไม่ใช่เรื่องใหญ่ ในความเป็นจริงความแตกต่างระหว่างปัญหาใน ป และปัญหาใน ตัวอย่างเช่น มันอาจจะบอบบางมาก ความสามารถในการบอกความแตกต่างเป็นสิ่งสำคัญสำหรับทุกคนที่ออกแบบอัลกอริทึมในโลกแห่งความเป็นจริง
พิจารณาปัญหาเส้นทางที่สั้นที่สุด ด้วยสถานที่สองแห่งเป้าหมายคือการระบุเส้นทางที่สั้นที่สุดระหว่างสถานที่เหล่านั้น iPhone คำนวณสิ่งนี้ในเวลาไม่กี่มิลลิวินาที ปัญหานี้เป็นปัญหาที่สามารถคำนวณได้
วิธีอัปเกรดเป็น python 3
ในทางกลับกันให้พิจารณาปัญหาหาบเร่ซึ่งเป้าหมายคือการเยี่ยมชมส่วนย่อยของจุดหมายปลายทางที่เป็นไปได้ซึ่งลงเอยที่ต้นทางขณะเดินทางในระยะทางที่สั้นที่สุด ปัญหานี้คล้ายกับปัญหาเส้นทางที่สั้นที่สุด แต่เป็นแบบ NP-complete นอกจากนี้ยังอธิบายว่าเหตุใดโลจิสติกส์ซัพพลายเชนจึงเป็นอุตสาหกรรมที่มีมูลค่าหลายพันล้านดอลลาร์
ในความเป็นจริงเราสามารถละเอียดอ่อนกว่านี้ได้ แทนที่จะถามเส้นทางที่สั้นที่สุด (P) เราสามารถขอเส้นทางที่ยาวที่สุดโดยไม่ต้องใช้นอต ปรากฎว่าปัญหาเส้นทางที่ยาวที่สุดคือ NP-complete
มีตัวอย่างอื่น ๆ อีกมากมายของความแตกต่างที่ลึกซึ้งนี้รวมถึงการระบุจุดยอดที่ครอบคลุมใน bipartite กับ bipartite สูตรบูลีนทั่วไปหรือที่น่าพอใจโดยมีตัวอักษรสองและสามตัวต่อข้อ ประเด็นคือยังไม่ชัดเจนในทันทีว่าปัญหาอยู่ใน P หรือ NP ดังนั้นเหตุผลในการวิเคราะห์รันไทม์จึงเป็นทักษะที่สำคัญ หากอัลกอริทึมที่เราต้องออกแบบมีไว้สำหรับปัญหาใน P เราก็จะรู้ว่ามีวิธีแก้ปัญหาที่มีประสิทธิภาพ ในทางกลับกันหากปัญหาอยู่ใน NP แสดงว่าเรามีกรณีที่คาดเดายากที่จะโต้แย้งเพื่อหาทางแก้ไขเนื่องจากอัลกอริทึมโดยทั่วไปใช้เวลาในการแก้ปัญหานานเกินไป
ในการทดสอบความซับซ้อนนี้เรากำหนดคลาสปัญหา P และ NP P แสดงถึงปัญหาที่คอมพิวเตอร์สามารถแก้ไขได้อย่างมีประสิทธิภาพในขณะที่ NP แสดงถึงปัญหาที่ตรวจสอบได้อย่างมีประสิทธิภาพ
ยังไม่มีใครแสดงได้ว่า P ไม่เท่ากับ NP หากปัญหาทั้งสองนี้เท่ากันมันคือสิ่งที่เรียกว่า P เทียบกับ NP และเป็นปัญหาเปิดที่สำคัญที่สุดในการคำนวณเชิงทฤษฎีในปัจจุบันหากไม่ใช่คณิตศาสตร์ทั้งหมด ในความเป็นจริงในปี 2000 สถาบัน Clay Math ได้ตั้งชื่อปัญหาว่า P vs. NP เป็นหนึ่งในคำถามเจ็ดข้อที่สำคัญที่สุดในวิชาคณิตศาสตร์และได้เสนอรางวัลเป็นล้านดอลลาร์สำหรับการทดสอบที่กำหนดวิธีแก้ปัญหานี้
ในบทความนี้เราจะเจาะลึกถึงขอบเขตของความสามารถในการคำนวณและความซับซ้อนโดยตอบคำถามใหญ่ ๆ เช่น 'คอมพิวเตอร์คืออะไร' ในขณะที่รายละเอียดอาจท่วมท้น แต่ก็มีการเรียนรู้เชิงลึกที่ควรค่าแก่การจดจำมากมาย:
มีบางสิ่งที่ไม่สามารถคำนวณได้เช่นปัญหาการหยุด
มีบางสิ่งที่ไม่สามารถคำนวณได้อย่างมีประสิทธิภาพเช่นปัญหาใน NPC
สิ่งที่สำคัญกว่ารายละเอียดคือวิธีคิดเกี่ยวกับการคำนวณและปัญหาด้านการคำนวณ ในชีวิตการทำงานของเราและแม้แต่ในชีวิตประจำวันของเราเราสามารถพบปัญหาที่ไม่เคยมีมาก่อนและสามารถใช้เครื่องมือและเทคนิคที่พิสูจน์แล้วเพื่อกำหนดแนวทางปฏิบัติที่ดีที่สุด