สามารถพัฒนาอัลกอริธึมที่แตกต่างกันได้หลายอย่างเพื่อแก้ไขปัญหาเดียวกัน ดังนั้นงานในการเลือกอัลกอริธึมที่มีประสิทธิภาพสูงสุดจึงเกิดขึ้น โปรดทราบว่าการประเมินประสิทธิภาพของอัลกอริธึมอย่างแม่นยำนั้นเป็นงานที่ยากมาก และในแต่ละกรณีจำเป็นต้องมีการวิจัยพิเศษ
ส่วนหนึ่งของทฤษฎีอัลกอริธึมที่เกี่ยวข้องกับการประมาณค่าคุณลักษณะของอัลกอริธึมเรียกว่าเมตริก สามารถแบ่งออกเป็นเชิงพรรณนา (เชิงคุณภาพ) และเมตริก (เชิงปริมาณ) ขั้นแรกจะตรวจสอบอัลกอริธึมจากมุมมองของความสอดคล้องที่สร้างขึ้นระหว่างข้อมูลอินพุตและผลลัพธ์ ส่วนที่สองตรวจสอบอัลกอริธึมจากมุมมองของความซับซ้อนของทั้งอัลกอริธึมเองและ "การคำนวณ" ที่พวกเขาระบุ เช่น กระบวนการของการเปลี่ยนแปลงตามลำดับของวัตถุโครงสร้าง สิ่งสำคัญคือต้องเน้นว่าความซับซ้อนของอัลกอริธึมและการคำนวณสามารถกำหนดได้หลายวิธีและอาจกลายเป็นว่าด้วยวิธีเดียวที่อัลกอริธึม กมันจะยากขึ้น ใน, และด้วยวิธีอื่น มันก็กลับกัน
ส่วนใหญ่แล้ว อัลกอริธึมจะถูกประเมินโดยหน่วยความจำที่ต้องการ จำนวนการดำเนินการที่ดำเนินการ เวลาในการแก้ไขปัญหา หรือข้อผิดพลาดในการคำนวณ ลักษณะเหล่านี้มักขึ้นอยู่กับพารามิเตอร์ (มิติ) ของปัญหาและไม่เชิงเส้น ดังนั้นในทฤษฎีอัลกอริธึมจึงมีทิศทางในการประเมินประสิทธิภาพของอัลกอริธึมตามการประมาณฟังก์ชันซีมโทติค: หน่วยความจำที่ต้องการ, เวลาในการคำนวณ ฯลฯ ในกรณีนี้จะมีการกำหนดพารามิเตอร์ที่สำคัญที่สุดของฟังก์ชันและศึกษาพฤติกรรมของฟังก์ชันเมื่อค่าพารามิเตอร์เพิ่มขึ้น ในระหว่างการศึกษาพวกเขากำลังพยายามกำหนดลักษณะของการพึ่งพาค่าของคุณลักษณะของอัลกอริทึมที่พิจารณาจากพารามิเตอร์ อาจเป็นเชิงเส้น (เช่น สัดส่วนกับพารามิเตอร์ 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.
สองมิติที่สำคัญที่สุดคือ:
สำหรับคอมพิวเตอร์ที่ใช้พลังงานแบตเตอรี่ (เช่น แล็ปท็อป) หรือสำหรับการคำนวณที่ยาว/มาก (เช่น ซูเปอร์คอมพิวเตอร์) การวัดประเภทอื่นที่น่าสนใจคือ:
ในบางกรณี จำเป็นต้องมีการวัดอื่นๆ ที่ใช้กันน้อยกว่า:
การทดสอบประเภทนี้ยังขึ้นอยู่กับการเลือกภาษาการเขียนโปรแกรม คอมไพเลอร์ และตัวเลือกของมันอย่างมาก ดังนั้นอัลกอริธึมที่เปรียบเทียบจะต้องถูกนำมาใช้ภายใต้เงื่อนไขเดียวกัน
ส่วนนี้เกี่ยวข้องกับการใช้หน่วยความจำหลัก (มักเป็น RAM) ที่จำเป็นสำหรับอัลกอริทึม เช่นเดียวกับการวิเคราะห์เวลาด้านบน การวิเคราะห์อัลกอริทึมมักจะใช้ ความซับซ้อนเชิงพื้นที่ของอัลกอริทึมเพื่อประมาณค่าหน่วยความจำรันไทม์ที่ต้องการตามฟังก์ชันของขนาดอินพุต ผลลัพธ์มักจะแสดงเป็น "O" ใหญ่
การใช้หน่วยความจำมีสี่ด้าน:
คอมพิวเตอร์อิเล็กทรอนิกส์และคอมพิวเตอร์ที่บ้านในยุคแรกๆ มีความจุหน่วยความจำในการทำงานค่อนข้างน้อย ดังนั้นในปี 1949 EDSAC จึงมีหน่วยความจำการทำงานสูงสุด 1,024 คำ 17 บิต และในปี 1980 Sinclair ZX80 เปิดตัวด้วยหน่วยความจำการทำงาน 1,024 ไบต์
คอมพิวเตอร์สมัยใหม่อาจมีหน่วยความจำจำนวนค่อนข้างมาก (อาจเป็นกิกะไบต์) ดังนั้นการบีบอัดหน่วยความจำที่ใช้โดยอัลกอริธึมลงในหน่วยความจำที่กำหนดจึงมีความจำเป็นน้อยกว่าเมื่อก่อน อย่างไรก็ตาม การมีอยู่ของหน่วยความจำสามประเภทที่แตกต่างกันมีความสำคัญ:
อัลกอริธึมที่หน่วยความจำที่ต้องการพอดีกับแคชของคอมพิวเตอร์จะเร็วกว่าอัลกอริธึมที่พอดีกับหน่วยความจำหลักมาก ซึ่งจะเร็วกว่าอัลกอริธึมที่ใช้พื้นที่เสมือนมาก เรื่องที่ซับซ้อนคือความจริงที่ว่าบางระบบมีแคชถึงสามระดับ ระบบที่ต่างกันมีจำนวนหน่วยความจำประเภทนี้แตกต่างกัน ดังนั้นผลกระทบของหน่วยความจำในอัลกอริทึมจึงอาจแตกต่างกันอย่างมากจากระบบหนึ่งไปอีกระบบหนึ่ง
ในยุคแรกๆ ของการประมวลผลแบบอิเล็กทรอนิกส์ หากอัลกอริทึมและข้อมูลไม่พอดีกับหน่วยความจำหลัก ก็จะใช้งานไม่ได้ ทุกวันนี้ การใช้หน่วยความจำเสมือนทำให้เกิดหน่วยความจำขนาดใหญ่ แต่ก็ต้องแลกกับประสิทธิภาพการทำงาน หากอัลกอริธึมและข้อมูลพอดีกับแคช ก็จะสามารถบรรลุความเร็วที่สูงมากได้ ดังนั้นการลดขนาดหน่วยความจำที่จำเป็นจะช่วยลดเวลาได้ อัลกอริธึมที่ไม่พอดีกับแคชทั้งหมด แต่มีให้ ตำแหน่งของลิงก์สามารถทำงานได้ค่อนข้างรวดเร็ว
พฤษภาคมกล่าวว่า:โปรแกรมต่างๆ เริ่มช้าลงอย่างรวดเร็วมากกว่าคอมพิวเตอร์ที่เร็วขึ้น
ในระบบที่แพร่หลาย การดำเนินการคำสั่งแบบแบ่งครึ่งสามารถยืดอายุการใช้งานแบตเตอรี่ได้เป็นสองเท่า และข้อมูลขนาดใหญ่ให้โอกาสสำหรับอัลกอริธึมที่ดีกว่า: การลดจำนวนการดำเนินการจาก 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
ใครก็ตามที่พัฒนาอัลกอริทึมจะต้องเชี่ยวชาญเทคนิคและแนวคิดพื้นฐานบางอย่าง ใครก็ตามที่เคยเผชิญกับงานยากๆ มักมีคำถามว่า “จะเริ่มตรงไหนดี?” วิธีหนึ่งที่เป็นไปได้คือตรวจดูคลังวิธีการอัลกอริทึมทั่วไปของคุณเพื่อดูว่าวิธีใดวิธีหนึ่งสามารถนำมาใช้ในการกำหนดวิธีแก้ไขปัญหาใหม่ได้หรือไม่ ถ้าไม่มีการสำรองดังกล่าวแล้วคุณจะพัฒนาอัลกอริธึมที่ดีได้อย่างไร? จะเริ่มต้นที่ไหน? เราทุกคนเคยมีประสบการณ์ที่น่าหงุดหงิดในการดูงานและไม่รู้ว่าต้องทำอย่างไร มาดูเทคนิคการแก้ปัญหาทั่วไปสามประการที่เป็นประโยชน์สำหรับการพัฒนาอัลกอริทึม
วิธีแรกเกี่ยวข้องกับการลดงานที่ยากให้เป็นลำดับของงานที่ง่ายกว่า แน่นอนว่า ความหวังก็คือปัญหาที่ง่ายกว่านั้นสามารถดำเนินการได้ง่ายกว่าปัญหาเดิม และวิธีแก้ปัญหาสำหรับปัญหาเดิมนั้นสามารถได้รับจากวิธีแก้ไขปัญหาที่ง่ายกว่าเหล่านี้ด้วย ขั้นตอนนี้เรียกว่า วิธีการกำหนดเป้าหมายส่วนตัววิธีนี้ดูสมเหตุสมผลมาก แต่เช่นเดียวกับวิธีการทั่วไปส่วนใหญ่ในการแก้ปัญหาหรือการออกแบบอัลกอริทึม การโอนไปยังปัญหาเฉพาะไม่ใช่เรื่องง่ายเสมอไป การตัดสินใจเลือกอย่างชาญฉลาดเกี่ยวกับปัญหาที่ง่ายกว่านั้นเป็นศิลปะหรือสัญชาตญาณมากกว่าวิทยาศาสตร์ ไม่มีกฎเกณฑ์ทั่วไปในการกำหนดประเภทของปัญหาที่สามารถแก้ไขได้โดยใช้แนวทางนี้ การคิดถึงปัญหาเฉพาะเจาะจงเริ่มต้นด้วยการถามคำถาม สามารถกำหนดเป้าหมายเฉพาะได้เมื่อตอบคำถามต่อไปนี้:
วิธีที่สองการพัฒนาอัลกอริธึมเรียกว่า วิธีการยกอัลกอริธึมการยกเริ่มต้นด้วยการเดาเบื้องต้นหรือคำนวณวิธีแก้ปัญหาเบื้องต้น จากนั้นการเคลื่อนไหวขึ้นที่เร็วที่สุดที่เป็นไปได้จะเริ่มต้นจากวิธีแก้ปัญหาเริ่มต้นไปสู่วิธีแก้ปัญหาที่ดีกว่า เมื่ออัลกอริธึมถึงจุดที่ไม่สามารถเลื่อนขึ้นได้อีกต่อไป อัลกอริธึมจะหยุด น่าเสียดายที่ไม่สามารถรับประกันได้ว่าโซลูชันสุดท้ายที่ได้รับจากอัลกอริธึมการยกนั้นเหมาะสมที่สุดเสมอไป สถานการณ์นี้มักจะจำกัดการใช้วิธียก
โดยทั่วไปวิธีการยกจะจัดอยู่ในประเภท "หยาบ" พวกเขาจำเป้าหมายบางอย่างได้และพยายามทำทุกอย่างที่ทำได้ ในที่ที่ทำได้ เพื่อเข้าใกล้เป้าหมายมากขึ้น ส่งผลให้พวกเขาค่อนข้าง “สายตาสั้น” สายตาสั้นของวิธีการยกสามารถอธิบายได้ชัดเจนตามตัวอย่างต่อไปนี้ สมมติว่าเราต้องค้นหาค่าสูงสุดของฟังก์ชัน ที่ =/(เอ็กซ์)นำเสนอโดยกราฟ (รูปที่ 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 ลิตรจะช่วยให้คุณเดินทางได้
ตอนนี้สามารถนำเสนออัลกอริธึมการขนส่งน้ำมันเชื้อเพลิงได้ดังนี้ เราเริ่มจาก เอ,มีความจุ 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ถัง
ดังนั้นในปัญหาที่พิจารณา วิธีการทำย้อนกลับคือปัญหาได้รับการแก้ไขเสมือนหนึ่งตั้งแต่ปลายเหตุ วิธีการตั้งเป้าหมายบางส่วนคือไม่ได้แก้ปัญหาทั้งหมดในคราวเดียว แต่เหมือนเดิมในบางส่วน และในที่สุดวิธีการขึ้นก็ปรากฏให้เห็นในความจริงที่ว่าไม่พบวิธีแก้ปัญหาในทันที แต่ตามลำดับราวกับว่ากำลังเข้าใกล้มัน