ใช่ฉันจะบอกว่ารู้อะไรบางอย่างเกี่ยวกับความซับซ้อนของการคำนวณเป็นสิ่งที่จำเป็นสำหรับโปรแกรมเมอร์ที่จริงจัง ตราบใดที่คุณไม่ได้จัดการกับชุดข้อมูลขนาดใหญ่คุณก็จะไม่เข้าใจความซับซ้อน แต่ถ้าคุณต้องการเขียนโปรแกรมที่จัดการกับปัญหาร้ายแรงที่คุณต้องการ
ในกรณีเฉพาะของคุณตัวอย่างของคุณในการค้นหาส่วนประกอบที่เชื่อมต่ออาจทำงานกับกราฟได้ถึงโหนด อย่างไรก็ตามหากคุณลองกราฟกับโหนดโหนดอัลกอริทึมของผู้สอนของคุณอาจมีการจัดการใน 1 วินาทีในขณะที่อัลกอริทึมของคุณจะมี (ขึ้นอยู่กับความซับซ้อนที่ไม่ดี) ใช้เวลา 1 ชั่วโมง 1 วันหรืออาจ 1 ชั่วนิรันดร์100100.000
ข้อผิดพลาดทั่วไปที่นักเรียนทำในหลักสูตรอัลกอริทึมของเราคือการทำซ้ำในอาร์เรย์ดังนี้:
while array not empty
examine first element of array
remove first element from array
นี่อาจไม่ใช่รหัสที่สวยที่สุด แต่ในโปรแกรมที่ซับซ้อนบางอย่างเช่นนี้อาจปรากฏขึ้นโดยที่โปรแกรมเมอร์ไม่ได้รับรู้ ตอนนี้ปัญหาของโปรแกรมนี้คืออะไร?
สมมติว่าเราทำงานบนชุดข้อมูลที่องค์ประกอบ เมื่อเปรียบเทียบกับโปรแกรมต่อไปนี้โปรแกรมเดิมจะทำงานช้าลง100.00050.000
while array not empty
examine last element of array
remove last element from array
ฉันหวังว่าคุณจะเห็นด้วยว่าการมีความรู้ในการทำให้โปรแกรมของคุณทำงานได้เร็วขึ้นครั้งน่าจะเป็นสิ่งสำคัญสำหรับโปรแกรมเมอร์ การทำความเข้าใจความแตกต่างระหว่างโปรแกรมทั้งสองนั้นต้องการความรู้พื้นฐานเกี่ยวกับทฤษฎีความซับซ้อนและความรู้เกี่ยวกับรายละเอียดของภาษาที่คุณกำลังเขียนโปรแกรม50.000
ในภาษาเทียมของฉัน "การลบองค์ประกอบออกจากอาร์เรย์" เลื่อนองค์ประกอบทั้งหมดไปทางขวาขององค์ประกอบที่ถูกลบหนึ่งตำแหน่งจากด้านซ้าย สิ่งนี้ทำให้การลบองค์ประกอบสุดท้ายเป็นการดำเนินการเนื่องจากเพื่อที่เราจะต้องโต้ตอบกับ 1 องค์ประกอบเท่านั้น การลบองค์ประกอบแรกคือเนื่องจากเพื่อที่จะลบองค์ประกอบแรกเราจำเป็นต้องเปลี่ยนองค์ประกอบอื่น ๆ ทั้งหมดหนึ่งตำแหน่งไปทางซ้ายเช่นกันO(1)O(n)n−1
แบบฝึกหัดพื้นฐานที่ซับซ้อนมากคือการพิสูจน์ว่าโปรแกรมแรกจะดำเนินการในขณะที่โปรแกรมที่สองใช้การดำเนินงานเท่านั้น หากคุณเสียบคุณจะเห็นว่าโปรแกรมหนึ่งมีประสิทธิภาพมากกว่าโปรแกรมอื่นอย่างเห็นได้ชัด12n2nn=100.000
นี่เป็นเพียงตัวอย่างของเล่น แต่มันจำเป็นต้องมีความเข้าใจพื้นฐานของความซับซ้อนในการบอกความแตกต่างระหว่างสองโปรแกรมและถ้าคุณพยายามที่จะดีบั๊ก / เพิ่มประสิทธิภาพของโปรแกรมที่ซับซ้อนมากขึ้นซึ่งมีข้อผิดพลาดนี้ ข้อผิดพลาดอยู่ที่ไหน เพราะความผิดพลาดเช่นการลบองค์ประกอบออกจากอาเรย์ในแบบนี้สามารถซ่อนได้เป็นอย่างดีโดย abstractions ในรหัส
การมีความเข้าใจที่ดีเกี่ยวกับความซับซ้อนยังช่วยเมื่อเปรียบเทียบสองวิธีในการแก้ปัญหา สมมติว่าคุณมีสองวิธีที่แตกต่างกันในการแก้ปัญหาส่วนประกอบที่เชื่อมต่อด้วยตัวคุณเอง: เพื่อที่จะตัดสินใจเลือกระหว่างพวกเขามันจะมีประโยชน์มากถ้าคุณสามารถประเมินความซับซ้อนของพวกเขาได้อย่างรวดเร็วและเลือกวิธีที่ดีกว่า