ศึกษาประสิทธิภาพของอัลกอริธึมที่พัฒนาขึ้น หลักการสำคัญที่เป็นรากฐานของการสร้างอัลกอริธึมที่มีประสิทธิภาพ ประสิทธิภาพมากกว่าอัลกอริธึมที่ยึดตาม

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

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

ส่วนใหญ่แล้ว อัลกอริธึมจะถูกประเมินโดยหน่วยความจำที่ต้องการ จำนวนการดำเนินการที่ดำเนินการ เวลาในการแก้ไขปัญหา หรือข้อผิดพลาดในการคำนวณ ลักษณะเหล่านี้มักขึ้นอยู่กับพารามิเตอร์ (มิติ) ของปัญหาและไม่เชิงเส้น ดังนั้นในทฤษฎีอัลกอริธึมจึงมีทิศทางในการประเมินประสิทธิภาพของอัลกอริธึมตามการประมาณฟังก์ชันซีมโทติค: หน่วยความจำที่ต้องการ, เวลาในการคำนวณ ฯลฯ ในกรณีนี้จะมีการกำหนดพารามิเตอร์ที่สำคัญที่สุดของฟังก์ชันและศึกษาพฤติกรรมของฟังก์ชันเมื่อค่าพารามิเตอร์เพิ่มขึ้น ในระหว่างการศึกษาพวกเขากำลังพยายามกำหนดลักษณะของการพึ่งพาค่าของคุณลักษณะของอัลกอริทึมที่พิจารณาจากพารามิเตอร์ อาจเป็นเชิงเส้น (เช่น สัดส่วนกับพารามิเตอร์ n) ลอการิทึม (เช่น สัดส่วนกับ log n) สมการกำลังสอง (เช่น สัดส่วนกับ n 2) เป็นต้น คุณสามารถเลือกอัลกอริธึมที่มีประสิทธิภาพมากขึ้นได้โดยการเปรียบเทียบการประมาณซีมโทติคของอัลกอริธึมที่แก้ปัญหาเดียวกันได้ พวกเขาบอกว่าค่าของพารามิเตอร์บางตัว T(n) อยู่ในลำดับ n x ถ้ามีค่าคงที่เป็นบวก k และ n o ดังนั้นสำหรับ n³n o ทั้งหมด ความไม่เท่าเทียมกันของ T(n) ≤ k n x ถืออยู่

สมมติว่า n คือจำนวนข้อมูลตัวเลขที่ได้รับจากอินพุตของอัลกอริธึมที่แตกต่างกันหลายอย่าง (A 1, A 2, A 3, A 4, A 5) ซึ่งทำการคำนวณด้วยความเร็วเท่ากัน - 1,000 การดำเนินการต่อวินาที แต่มีความแตกต่างกัน การประมาณเชิงเส้นกำกับ ตารางที่ 1.8 แสดงค่า n ที่อัลกอริธึมเหล่านี้สามารถประมวลผลได้ใน 1 วินาที 1 นาที และ 1 ชั่วโมง (ค่าจะถูกปัดเศษลงเป็นจำนวนเต็มที่ใกล้ที่สุด) ข้อมูลในตาราง 1.3 แสดงให้เห็นอย่างชัดเจนว่าประสิทธิภาพของอัลกอริทึม (เช่น จำนวนข้อมูลที่ประมวลผลต่อหน่วยเวลา) ขึ้นอยู่กับลักษณะของฟังก์ชันการประเมินเชิงเส้นกำกับอย่างมีนัยสำคัญ

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

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

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

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

พื้นหลัง

ความสำคัญของประสิทธิภาพโดยเน้นที่เวลาดำเนินการได้รับการเน้นย้ำโดย Ada Lovelace ในปี 1843 เกี่ยวกับเครื่องมือวิเคราะห์ทางกลของ Charles Babbage:

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

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

คอมพิวเตอร์ยุคใหม่เร็วกว่าคอมพิวเตอร์ยุคแรกๆ มากและมีหน่วยความจำมากกว่ามาก (กิกะไบต์แทนที่จะเป็นกิโลไบต์) อย่างไรก็ตาม Donald Knuth เน้นย้ำว่าประสิทธิภาพยังคงเป็นปัจจัยสำคัญ:

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

ทบทวน

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

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

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

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

การวิเคราะห์เชิงทฤษฎี

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

การกำหนด ชื่อ ตัวอย่าง
O(1) (\รูปแบบการแสดงผล O(1)\,) ถาวร การกำหนดว่าตัวเลขเป็นคู่หรือคี่ การใช้ตารางค้นหาขนาดคงที่ การใช้ฟังก์ชันแฮชที่เหมาะสมเพื่อเลือกองค์ประกอบ
O (log ⁡ n) (\displaystyle O(\log n)\,) ลอการิทึม การค้นหาองค์ประกอบในอาร์เรย์ที่เรียงลำดับโดยใช้การค้นหาแบบไบนารีหรือทรีที่สมดุล คล้ายกับการดำเนินการกับฮีปทวินาม
O(n) (\รูปแบบการแสดงผล O(n)\,) เชิงเส้น การค้นหาองค์ประกอบในรายการที่ไม่เรียงลำดับหรือแผนผังที่ไม่สมดุล (กรณีที่แย่ที่สุด) บวกสอง n- บิตตัวเลขโดยใช้การพกพาจากต้นทางถึงปลายทาง
O (n log ⁡ n) (\displaystyle O(n\log n)\,) กึ่งเชิงเส้น เชิงเส้นลอการิทึม คำนวณการแปลงฟูเรียร์ที่รวดเร็ว, การเรียงลำดับฮีป, การเรียงลำดับอย่างรวดเร็ว (กรณีที่ดีที่สุดและโดยเฉลี่ย), การเรียงลำดับแบบผสาน
O (n 2) (\displaystyle O(n^(2))\,) สี่เหลี่ยม คูณสอง n-ตัวเลขหลักโดยใช้อัลกอริธึมอย่างง่าย, การเรียงลำดับแบบฟอง (กรณีที่แย่ที่สุด), การเรียงลำดับเชลล์, การเรียงลำดับแบบด่วน (กรณีที่แย่ที่สุด), การเรียงลำดับการเลือก, การเรียงลำดับการแทรก
O (c n) , c > 1 (\displaystyle O(c^(n)),\;c>1) เอ็กซ์โปเนนเชียล การค้นหาวิธีแก้ปัญหา (ที่แน่นอน) สำหรับปัญหาพนักงานขายที่กำลังเดินทางโดยใช้การเขียนโปรแกรมแบบไดนามิก การพิจารณาว่าข้อความสั่งเชิงตรรกะสองข้อความเทียบเท่ากันหรือไม่โดยใช้การค้นหาอย่างละเอียด

การทดสอบเพื่อยืนยัน: การวัดประสิทธิภาพ

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

การทดสอบเกณฑ์มาตรฐานบางรายการให้การวิเคราะห์เปรียบเทียบของการคอมไพล์และการตีความภาษาต่างๆ เช่น PC Benchmark Collection ของ Roy Longbottom และ เกมเกณฑ์มาตรฐานภาษาคอมพิวเตอร์เปรียบเทียบประสิทธิภาพของการใช้งานทั่วไปในภาษาการเขียนโปรแกรมบางภาษา

ปัญหาการดำเนินงาน

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

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

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

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

การวัดการใช้ทรัพยากร

การวัดมักจะแสดงเป็นฟังก์ชันของขนาดอินพุต n.

สองมิติที่สำคัญที่สุดคือ:

  • เวลา: อัลกอริธึมใช้เวลานานเท่าใดใน CPU
  • หน่วยความจำ: ต้องใช้หน่วยความจำในการทำงานจำนวนเท่าใด (โดยปกติคือ RAM) สำหรับอัลกอริทึม มีสองด้านดังนี้: จำนวนหน่วยความจำสำหรับโค้ดและจำนวนหน่วยความจำสำหรับข้อมูลที่โค้ดทำงาน

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

  • การใช้พลังงานโดยตรง: พลังงานที่จำเป็นในการใช้งานคอมพิวเตอร์
  • การใช้พลังงานทางอ้อม: พลังงานที่จำเป็นสำหรับการทำความเย็น แสงสว่าง ฯลฯ

ในบางกรณี จำเป็นต้องมีการวัดอื่นๆ ที่ใช้กันน้อยกว่า:

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

เวลา

ทฤษฎี

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

หน่วยความจำ

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

การใช้หน่วยความจำมีสี่ด้าน:

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

คอมพิวเตอร์อิเล็กทรอนิกส์และคอมพิวเตอร์ที่บ้านในยุคแรกๆ มีความจุหน่วยความจำในการทำงานค่อนข้างน้อย ดังนั้นในปี 1949 EDSAC จึงมีหน่วยความจำการทำงานสูงสุด 1,024 คำ 17 บิต และในปี 1980 Sinclair ZX80 เปิดตัวด้วยหน่วยความจำการทำงาน 1,024 ไบต์

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

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

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

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

ตัวอย่างของอัลกอริธึมที่มีประสิทธิภาพ

คำติชมของสถานะปัจจุบันของการเขียนโปรแกรม

โปรแกรมต่างๆ เริ่มช้าลงอย่างรวดเร็วมากกว่าคอมพิวเตอร์ที่เร็วขึ้น

พฤษภาคมกล่าวว่า:

ในระบบที่แพร่หลาย การดำเนินการคำสั่งแบบแบ่งครึ่งสามารถยืดอายุการใช้งานแบตเตอรี่ได้เป็นสองเท่า และข้อมูลขนาดใหญ่ให้โอกาสสำหรับอัลกอริธึมที่ดีกว่า: การลดจำนวนการดำเนินการจาก N x N เป็น N x log(N) มีผลกระทบอย่างมากต่อ N ขนาดใหญ่... สำหรับ N = 3 หมื่นล้าน การเปลี่ยนแปลงเหล่านี้คล้ายคลึงกับการปรับปรุงทางเทคโนโลยีตลอด 50 ปี

การแข่งขันเพื่ออัลกอริธึมที่ดีที่สุด

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

ดูสิ่งนี้ด้วย

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

ส่งผลงานดีๆ ของคุณในฐานความรู้ได้ง่ายๆ ใช้แบบฟอร์มด้านล่าง

นักศึกษา นักศึกษาระดับบัณฑิตศึกษา นักวิทยาศาสตร์รุ่นเยาว์ ที่ใช้ฐานความรู้ในการศึกษาและการทำงาน จะรู้สึกขอบคุณเป็นอย่างยิ่ง

ยังไม่มีงานเวอร์ชัน HTML
คุณสามารถดาวน์โหลดไฟล์เก็บถาวรของงานได้โดยคลิกที่ลิงค์ด้านล่าง

เอกสารที่คล้ายกัน

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

    งานหลักสูตร เพิ่มเมื่อ 07/07/2013

    แนวคิดของอัลกอริธึมและการวิเคราะห์การประมาณค่าทางทฤษฎีเกี่ยวกับความซับซ้อนของเวลาของอัลกอริธึมการคูณเมทริกซ์ การวิเคราะห์เชิงเปรียบเทียบของการประมาณความซับซ้อนของเวลาของอัลกอริธึมบางคลาสโดยใช้โปรแกรมและการเขียนโปรแกรมทั่วไปโดยใช้เทคโนโลยี Open MP

    วิทยานิพนธ์เพิ่มเมื่อ 08/12/2017

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

    บทคัดย่อ เพิ่มเมื่อ 27/11/2555

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

    วิทยานิพนธ์เพิ่มเมื่อ 16/07/2014

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

    งานหลักสูตรเพิ่มเมื่อ 21/06/2013

    การประมาณความซับซ้อนในการคำนวณของโปรแกรม การใช้อัลกอริธึมการเข้ารหัสข้อมูลของ Huffman การเข้ารหัสการทดสอบในไบนารี่และฮัฟฟ์แมนทรี รหัสอักขระไบนารี สัญลักษณ์และความถี่ของการปรากฏในข้อความ การคำนวณความซับซ้อนของอัลกอริทึม

    ทดสอบเพิ่มเมื่อ 12/16/2555

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

    งานหลักสูตรเพิ่มเมื่อ 25/06/2556

หลักการสำคัญในการสร้างอัลกอริทึมที่มีประสิทธิภาพ

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

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

  • 1. เป็นไปได้ไหมที่จะแก้ไขปัญหาบางส่วน? เป็นไปได้ไหมที่จะแก้ไขปัญหาที่เหลือโดยไม่สนใจเงื่อนไขบางประการ?
  • 2. สามารถแก้ไขปัญหาเป็นกรณีพิเศษได้หรือไม่? เป็นไปได้ไหมที่จะพัฒนาอัลกอริธึมที่สร้างโซลูชันที่ตรงตามเงื่อนไขทั้งหมดของปัญหา แต่ข้อมูลอินพุตนั้นถูกจำกัดอยู่เพียงชุดย่อยของข้อมูลอินพุตทั้งหมด
  • 3. มีอะไรเกี่ยวข้องกับปัญหาที่ไม่เข้าใจกันดีหรือไม่? หากเราพยายามเจาะลึกถึงคุณลักษณะบางประการของปัญหา เราจะสามารถเรียนรู้บางอย่างที่จะช่วยให้เราเข้าใกล้แนวทางแก้ไขได้หรือไม่
  • 4. มีวิธีแก้ไขปัญหาที่คล้ายกันหรือไม่? เป็นไปได้หรือไม่ที่จะแก้ไขแนวทางแก้ไขปัญหาที่กำลังพิจารณาอยู่? เป็นไปได้ไหมว่าปัญหานี้เทียบเท่ากับปัญหาที่ยังไม่ได้รับการแก้ไขที่ทราบ

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

โดยทั่วไปวิธีการยกจะจัดอยู่ในประเภท "หยาบ" พวกเขาจำเป้าหมายบางอย่างได้และพยายามทำทุกอย่างที่ทำได้ ในที่ที่ทำได้ เพื่อเข้าใกล้เป้าหมายมากขึ้น ส่งผลให้พวกเขาค่อนข้าง “สายตาสั้น” สายตาสั้นของวิธีการยกสามารถอธิบายได้ชัดเจนตามตัวอย่างต่อไปนี้ สมมติว่าเราต้องค้นหาค่าสูงสุดของฟังก์ชัน ที่ =/(เอ็กซ์)นำเสนอโดยกราฟ (รูปที่ 2.15) หากเป็นค่าเริ่มต้นของการโต้แย้ง x = ก,จากนั้นวิธีการขึ้นจะให้ความทะเยอทะยานไปสู่เป้าหมายที่ใกล้ที่สุดนั่นคือ ให้เป็นค่าของฟังก์ชัน ณ จุดนั้น x = ข,โดยที่ค่าสูงสุดที่แท้จริงของฟังก์ชันนี้คือ = c ในกรณีนี้

ข้าว. 2.15. ภาพประกอบของวิธีการยก วิธีการยกจะค้นหาค่าสูงสุดเฉพาะที่ แต่ไม่ใช่ค่าสูงสุดโดยรวม นี่คือ “ความหยาบ” ของวิธีการยก

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

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

เรามาแก้ไขปัญหานี้โดยใช้วิธีทำงานแบบย้อนกลับ คุณสามารถข้ามทะเลทรายด้วยระยะทางเท่าใดจากจุดสิ้นสุดด้วยเชื้อเพลิงที่เท่ากันทุกประการ ถึงรถถัง? ลองพิจารณาคำถามนี้เพื่อ ถึง= 1,2, 3,... จนกว่าเราจะพบจำนวนเต็มดังกล่าว พีอะไร การเติมน้ำมันเต็มถังช่วยให้คุณข้ามทะเลทรายระยะทาง 1,000 กิโลเมตรได้ สำหรับ ถึง= 1 คำตอบคือ 500 กม. = 500 ลิตร (จุด ใน),ดังแสดงในรูป 2.16.

ข้าว. 2.16.

สามารถเติมน้ำมันรถได้ตรงจุด ในและข้ามทะเลทรายที่เหลืออีก 500 กม. มีการกำหนดเป้าหมายเฉพาะไว้เนื่องจากปัญหาเดิมไม่สามารถแก้ไขได้ทันที

เรามาแกล้งทำเป็นว่า ถึง= 2 เช่น มีสองถังเต็ม (1,000 ลิตร) สถานการณ์นี้แสดงไว้ในรูปที่ 2.16. ค่าสูงสุดของ jCj คือเท่าใด โดยเริ่มจากน้ำมันเชื้อเพลิง 1,000 ลิตรจากจุด (500 - Xj) สามารถบรรทุกน้ำมันเชื้อเพลิงได้เพียงพอจนถึงจุดสิ้นสุดการเดินทาง ดังเช่นใน ถึง= 1. วิธีหนึ่งในการกำหนดค่าที่ยอมรับได้ เอ็กซ์ (เป็นดังนี้ เราเติมน้ำมันถึงจุด (500 - Xj) เราก็ไป เอ็กซ์ (กิโลเมตรถึงจุด ในและเทน้ำมันเชื้อเพลิงทั้งหมดลงในที่เก็บ ยกเว้นส่วนที่ต้องกลับจุด (500 - Xj) เมื่อถึงจุดนี้ถังจะว่างเปล่า ตอนนี้เราเติมถังที่สองแล้วขับ Xj กิโลเมตรไป ใน,มารับได้ที่ ในเชื้อเพลิงเหลืออยู่ที่นั่นและจาก ในเราจะไป C เต็มถัง ระยะทางที่เดินทางทั้งหมดประกอบด้วยสามส่วนตาม เอ็กซ์ (กิโลเมตรและหนึ่งส่วน ดวงอาทิตย์ยาว 500 กม. ดังนั้นจากสมการ 3x t + 500 = 1,000 เราพบคำตอบ Xj = 500/3 ดังนั้น รถถังสองถัง (1,000 ลิตร) ให้คุณเดินทาง Z> 2 = 500 +x ( = 500(1 + 1/3) กม.

ลองพิจารณาดู เค = 3. คุณสามารถเติมน้ำมัน 1,500 ลิตรจากจุดใดเพื่อให้รถจี๊ปส่ง 1,000 ลิตรถึงจุด (500 - x))? ลองหาค่าที่ใหญ่ที่สุดของ x 2 โดยที่เมื่อเหลือเชื้อเพลิง 1,500 ลิตรจากจุด (500 - Xj - x 2) เราจะสามารถส่งน้ำมัน 1,000 ลิตรไปยังจุด (500 - Xj) ได้ เราออกจากจุด (500 - Xj - x 2) ขับรถไปที่ (500 - x) ถ่ายโอนเชื้อเพลิงทั้งหมดยกเว้น x 2 ลิตรแล้วกลับไปที่จุด (500 - Xj - x 2) พร้อมถังเปล่า ทำซ้ำขั้นตอนนี้เราจะใช้จ่าย 4x 2 ลิตรในการเดินทางและทิ้ง (1,000 - 4x 2) ลิตรไว้ที่จุด (500 - x L) ตอนนี้ถึงจุด (500 - Xj - x 2) เหลือ 500 ลิตรพอดี เราเติม 500 ลิตรสุดท้ายแล้วไปที่จุด (500 - Xj) โดยใช้เวลา x 2 ลิตรไปกับสิ่งนี้

เมื่อถึงจุดนั้น (500 - Xj) เราใช้เชื้อเพลิง 5x2 ลิตรในการเดินทาง เหลือทั้งหมด (1,500 - 5x 2) ลิตรที่นี่ จำนวนนี้ควรเท่ากับ 1,000 ลิตรนั่นคือ x 2 = 500/5. จากนี้เราสรุปได้ว่า 1,500 ลิตรให้คุณขับได้

การดำเนินกระบวนการทำงานแบบอุปนัยย้อนกลับอย่างต่อเนื่อง เราได้รับสิ่งนั้น ถังน้ำมันทำให้เราผ่านไปได้ ดรกิโลเมตร ที่ไหน ดร = 500(1 +1/3 + 1/5 + ... + 1/(2 - 1)).

เราต้องหาค่าที่น้อยที่สุด พีที่ที่ ดร> 1,000 การคำนวณอย่างง่ายแสดงให้เห็นว่าสำหรับ น= 7 เรามี ง?= 997.5 กม. เช่น เจ็ดถังหรือน้ำมันเชื้อเพลิง 3,500 ลิตรจะช่วยให้คุณเดินทางได้

  • 977.5 กม. ถังที่แปดเต็ม - นี่เกินความจำเป็นในการขนส่ง 3,500 ลิตรจากจุดหนึ่ง ไปยังจุดที่อยู่ที่
  • 22.5 กม. (1,000 - 977.5) จาก A ผู้อ่านได้รับโอกาสในการตรวจสอบอย่างอิสระว่า 337.5 ลิตรเพียงพอที่จะส่งน้ำมันเชื้อเพลิง 3,500 ลิตรไปยังเครื่องหมาย 22.5 กม. ดังนั้น ในการข้ามทะเลทรายจาก I ถึง C โดยรถยนต์ คุณต้องใช้เชื้อเพลิง 3837.5 ลิตร

ตอนนี้สามารถนำเสนออัลกอริธึมการขนส่งน้ำมันเชื้อเพลิงได้ดังนี้ เราเริ่มจาก เอ,มีความจุ 3837.5 ลิตร. มีเชื้อเพลิงเพียงพอที่จะค่อยๆขนส่ง 3,500 ลิตรไปถึงจุดนั้น

22.5 กม. ซึ่งท้ายที่สุดแล้วรถจี๊ปจะมีถังเปล่าและน้ำมันเชื้อเพลิงเพียงพอสำหรับการเติมน้ำมันเต็ม 7 ครั้ง เชื้อเพลิงนี้เพียงพอที่จะขนส่ง 3,000 ลิตรไปยังจุด 22.5 + 500/13 กม. จาก เอ,โดยที่ถังรถจะว่างเปล่าอีกครั้ง การคมนาคมครั้งต่อไปจะนำรถจี๊ปไปยังจุดที่อยู่ห่างจาก 22.5 + 500/13 + 500/11 กม. เอ,พร้อมถังเปล่าของรถและ 2,500 ลิตรในโกดัง

ดำเนินการต่อในลักษณะนี้ เราก้าวไปข้างหน้าด้วยการวิเคราะห์ที่ดำเนินการโดยการทำงานแบบย้อนกลับ อีกไม่นานรถจี๊ปจะถึงระยะทาง 500(1 - 1/3) กม. พร้อมน้ำมันเชื้อเพลิง 1,000 ลิตร จากนั้นเราจะขนส่งน้ำมัน 500 ลิตรไปยังจุดนั้น ใน,เทลงในถังของรถแล้วขับไปยังจุดโดยไม่หยุด กับ(รูปที่ 2.17)


ข้าว. 2.17.

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

คำถามเกิดขึ้นว่าเป็นไปได้หรือไม่ที่จะเดินทาง 1,000 กม. โดยใช้เชื้อเพลิงน้อยกว่า 3837.5 ลิตร ปรากฎว่าคุณทำไม่ได้ การพิสูจน์คำกล่าวนี้ค่อนข้างซับซ้อน อย่างไรก็ตาม สามารถโต้แย้งได้ค่อนข้างเป็นไปได้ดังต่อไปนี้ แน่นอนว่าเรากำลังแสดงอยู่ วิธีที่ดีที่สุดสำหรับ ถึง= 1. เมื่อใด ถึง= 2 แผนใช้สำหรับ ถึง= 1 จากนั้นเชื้อเพลิงถังที่สองจะถูกเปิดใช้งานเพื่อให้อยู่ห่างจากจุดมากที่สุด ใน.จุดเริ่มต้นสำหรับ ถึงรถถังคือเรารู้วิธีปฏิบัติตัวให้ดีที่สุดในกรณีของ (ถึง - 1) รถถังและเคลื่อนที่กลับไปให้ไกลที่สุดด้วยความช่วยเหลือ WHOถัง

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

คำถามควบคุม

  • 1. ให้คำจำกัดความของวัตถุ คลาส ระบบ แบบจำลอง
  • 2. ตั้งชื่อประเภทโมเดลหลัก
  • 3. การสร้างแบบจำลองการจำลองคืออะไร?
  • 4. มีโมเดลใดบ้างที่ได้รับการจำแนกประเภท?
  • 5. ระบุขั้นตอนหลักของการสร้างแบบจำลอง
  • 6. อัลกอริธึมคืออะไร?
  • 7. แสดงรายการคุณสมบัติของอัลกอริทึม
  • 8. ขั้นตอนใดที่ดำเนินการในการสร้างอัลกอริทึมให้สมบูรณ์?
  • 9. ผังงานอัลกอริทึมคืออะไร?
  • 10. กำหนดบล็อกฟังก์ชัน
  • 11. อัลกอริธึมใดเรียกว่าโครงสร้าง?
  • 12. ตั้งชื่อหลักการสำคัญที่เป็นพื้นฐานของการสร้างอัลกอริทึมที่มีประสิทธิภาพ