portaldacalheta.pt
  • หลัก
  • ทีมแบบกระจาย
  • เคล็ดลับและเครื่องมือ
  • ชีวิตนักออกแบบ
  • นวัตกรรม
เทคโนโลยี

บทนำสู่ทฤษฎีและความซับซ้อนของการคำนวณ



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

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



ทฤษฎีการคำนวณและความซับซ้อน



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



มุมมองที่เป็นนามธรรมของการคำนวณทำให้เกิดผลลัพธ์ที่ได้รับการทดสอบของเวลาและมีคุณค่าสำหรับเราในปัจจุบันเช่นเดียวกับที่พวกเขาได้รับการพัฒนาครั้งแรกในปี 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

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

ทุกสิ่งที่คำนวณได้นั้นสามารถคำนวณได้โดยเครื่องทัวริง

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

การรับรู้และการตัดสินใจ

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

ภาษาเป็นที่รู้จักหากมีเครื่องทัวริงที่จำได้

ย

ภาษาสามารถตัดสินใจได้หากมีเครื่องทัวริงที่ตัดสินใจได้

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

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

ความไม่ชัดเจน

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

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

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

f (i, j) = 1 si มผมคุณยอมรับญ>, 0 ตรงกันข้าม

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

ตอนนี้เรามากำหนดภาษากัน ล ซึ่งประกอบด้วยการเข้ารหัสสตริงของเครื่องทัวริงที่ไม่ยอมรับคำอธิบายของตัวเอง:

L =

เช่นบางเครื่อง Mหนึ่งสามารถส่งออก 0 สำหรับอินพุตหนึ่ง& gt ในขณะที่เครื่องอื่น ๆ M2สามารถให้เอาต์พุต 1 สำหรับอินพุต2>. เพื่อพิสูจน์ว่าภาษานี้ไม่สามารถตัดสินใจได้เราถามว่า Mลเครื่องที่ตัดสินใจภาษา L เมื่อมีคำอธิบายของตัวเองล> เป็นอินพุต มีสองโอกาส:

มลคุณยอมรับล>

หรือ

มลปฏิเสธล>

ศรีมลยอมรับการเข้ารหัสของตัวเองนั่นหมายความว่าล> ไม่ได้อยู่ในภาษา L อย่างไรก็ตามหากเป็นเช่นนั้น Mลฉันไม่ควรยอมรับการเข้ารหัสของคุณตั้งแต่แรก ในทางกลับกันถ้ามลไม่ยอมรับการเข้ารหัสของตัวเองแล้วล> เป็นภาษา L ตามด้วย Mลควรยอมรับการเข้ารหัสสตริงของคุณ

ในทั้งสองกรณีเรามีความขัดแย้งหรือในแง่คณิตศาสตร์ความขัดแย้งซึ่งแสดงให้เห็นว่าภาษา L นั้นไม่สามารถตัดสินใจได้ ดังนั้นเราจึงได้อธิบายปัญหาแรกที่แก้ไขไม่ได้ของเรา

การหยุดปัญหา

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

ภาษาของการเข้ารหัสเครื่องทัวริงที่หยุดอยู่บนสตริงว่าง

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

สรุป

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

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

ทิ้งฟังก์ชันและภาษาที่คำนวณได้ไว้เบื้องหลังตอนนี้เราจะพูดถึงความซับซ้อนของการคำนวณการตรวจสอบการคำนวณที่มีประสิทธิภาพและ P vs. NP.

ความซับซ้อน

ช้าเทียบกับ เร็ว

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

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

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

คำจำกัดความที่เป็นทางการ

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

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

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

P เทียบกับ NP

ดังนั้นเรามาถึงปัญหาของ ป ต่อต้าน ตัวอย่างเช่น . นักวิทยาศาสตร์คอมพิวเตอร์และนักคณิตศาสตร์หลายคนเชื่ออย่างนั้น ป ย ตัวอย่างเช่น พวกเขาไม่เหมือนกัน หากเป็นเช่นนั้นความหมายจะลึกซึ้งเกินกว่าเหตุ โครงสร้างพื้นฐานดิจิทัลส่วนใหญ่ในปัจจุบันขึ้นอยู่กับความจริงที่ว่ามีปัญหาใน ตัวอย่างเช่น ที่ไม่ได้อยู่ใน ป . หากไม่เป็นเช่นนั้นวิธีการเข้ารหัสจะพังทลายลงในชั่วข้ามคืนทำให้ผู้ที่มีวิธีแก้ปัญหาอย่างมีประสิทธิภาพ 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

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

วิศวกรแบ็คเอนด์อาวุโสทีมช่างทอง

อื่น ๆ

วิศวกรแบ็คเอนด์อาวุโสทีมช่างทอง
การรวมซอฟต์แวร์ที่ดีที่สุด: บทช่วยสอนเกี่ยวกับอูฐ Apache

การรวมซอฟต์แวร์ที่ดีที่สุด: บทช่วยสอนเกี่ยวกับอูฐ Apache

แบ็คเอนด์

โพสต์ยอดนิยม
เอกสาร Agile: การปรับสมดุลความเร็วและการรักษาความรู้
เอกสาร Agile: การปรับสมดุลความเร็วและการรักษาความรู้
ทำลายหลักการออกแบบ (ด้วยอินโฟกราฟิก)
ทำลายหลักการออกแบบ (ด้วยอินโฟกราฟิก)
วิธีจัดโครงสร้างลำดับชั้นการพิมพ์ที่มีประสิทธิภาพ
วิธีจัดโครงสร้างลำดับชั้นการพิมพ์ที่มีประสิทธิภาพ
ฮาร์ดแวร์ที่คล่องตัวพร้อมการพัฒนาซอฟต์แวร์ในตัว
ฮาร์ดแวร์ที่คล่องตัวพร้อมการพัฒนาซอฟต์แวร์ในตัว
วิธีการรวม OAuth 2 เข้ากับ Django / DRF Back-end ของคุณโดยไม่บ้า
วิธีการรวม OAuth 2 เข้ากับ Django / DRF Back-end ของคุณโดยไม่บ้า
 
GWT Toolkit: สร้างส่วนหน้า JavaScript ที่มีประสิทธิภาพโดยใช้ Java
GWT Toolkit: สร้างส่วนหน้า JavaScript ที่มีประสิทธิภาพโดยใช้ Java
แหล่งข้อมูลสำหรับธุรกิจขนาดเล็กสำหรับ COVID-19: เงินกู้เงินช่วยเหลือและสินเชื่อ
แหล่งข้อมูลสำหรับธุรกิจขนาดเล็กสำหรับ COVID-19: เงินกู้เงินช่วยเหลือและสินเชื่อ
Libation Frontiers: เจาะลึกอุตสาหกรรมไวน์โลก
Libation Frontiers: เจาะลึกอุตสาหกรรมไวน์โลก
เรียนรู้ Markdown: เครื่องมือการเขียนสำหรับนักพัฒนาซอฟต์แวร์
เรียนรู้ Markdown: เครื่องมือการเขียนสำหรับนักพัฒนาซอฟต์แวร์
พบกับ Phoenix: กรอบงานคล้ายรางสำหรับเว็บแอปสมัยใหม่บน Elixir
พบกับ Phoenix: กรอบงานคล้ายรางสำหรับเว็บแอปสมัยใหม่บน Elixir
โพสต์ยอดนิยม
  • โทเค็น erc 20 คืออะไร
  • ความแตกต่างระหว่าง s และ c corp
  • เป็นรูปแบบองค์ประกอบหรือหลักการ
  • วิธีออกแบบหน้าแลนดิ้งเพจ
  • วิกฤตการณ์ทางการเงินในกรีซอธิบาย
  • วันที่ใหม่ ().gettime()
หมวดหมู่
  • ทีมแบบกระจาย
  • เคล็ดลับและเครื่องมือ
  • ชีวิตนักออกแบบ
  • นวัตกรรม
  • © 2022 | สงวนลิขสิทธิ์

    portaldacalheta.pt