ฉันชอบตัวอย่างจากหนังสือแนะนำสู่อัลกอริทึมซึ่งแสดงให้เห็นถึงความสำคัญของประสิทธิภาพอัลกอริทึม:
ลองเปรียบเทียบสองขั้นตอนวิธีการเรียงลำดับ: เรียงแทรกและผสานการเรียงลำดับ ความซับซ้อนของพวกเขาคือและO ( n log n ) = c 2 n lg nตามลำดับ โดยปกติ merge sort มีปัจจัยคงที่ใหญ่กว่าดังนั้นสมมติค1 < ค 2O(n2)=c1n2O(nlogn)=c2nlgnc1<c2
เพื่อตอบคำถามของคุณเราประเมินเวลาดำเนินการของคอมพิวเตอร์ที่เร็วกว่า (A) ใช้อัลกอริทึมการเรียงลำดับการแทรกกับคอมพิวเตอร์ที่ช้ากว่า (B) ใช้อัลกอริทึมการเรียงลำดับผสาน
เราถือว่า:
- ขนาดของปัญหาอินพุตคือ 10 ล้านตัว: ;n=107
- คอมพิวเตอร์ A ประมวลผลคำสั่งต่อวินาที (~ 10GHz);1010
- คอมพิวเตอร์ B รันคำสั่งเพียงต่อวินาที (~ 10MHz);107
- ปัจจัยคงที่คือ (สิ่งที่ประเมินค่าสูงไปเล็กน้อย) และc 2 = 50 (ในความเป็นจริงมีขนาดเล็กกว่า)c1=2c2=50
ดังนั้นด้วยสมมติฐานเหล่านี้
สำหรับคอมพิวเตอร์ A เพื่อเรียงหมายเลข107และ
2⋅(107)2 คำแนะนำ1010 คำแนะนำ/วินาที= 2 ⋅104 วินาที
107
50⋅107lg107 คำแนะนำ107 คำแนะนำ/วินาที≈ 1163 วินาที
สำหรับคอมพิวเตอร์ B.
ดังนั้นคอมพิวเตอร์ซึ่งช้ากว่า 1,000 เท่าสามารถแก้ปัญหาได้เร็วขึ้น 17 เท่า ในความเป็นจริงข้อดีของการจัดเรียงจะยิ่งสำคัญและเพิ่มขึ้นตามขนาดของปัญหา ฉันหวังว่าตัวอย่างนี้ช่วยตอบคำถามของคุณ
อย่างไรก็ตามนี่ไม่ได้เกี่ยวกับความซับซ้อนของอัลกอริทึม วันนี้แทบจะเป็นไปไม่ได้เลยที่จะได้รับการเร่งความเร็วอย่างมีนัยสำคัญเพียงแค่ใช้งานเครื่องที่มีความถี่ CPU สูงขึ้น ผู้คนจำเป็นต้องออกแบบอัลกอริทึมสำหรับระบบมัลติคอร์ที่ขยายขนาดได้ดี นอกจากนี้ยังเป็นงานที่ยุ่งยากเนื่องจากการเพิ่มคอร์การเพิ่มโอเวอร์เฮด (สำหรับการจัดการการเข้าถึงหน่วยความจำเป็นต้น) ก็เพิ่มขึ้นเช่นกัน ดังนั้นจึงเป็นไปไม่ได้เลยที่จะได้รับความเร็วเชิงเส้น
ดังนั้นการสรุปการออกแบบอัลกอริธึมที่มีประสิทธิภาพในวันนี้จึงมีความสำคัญเท่า ๆ กันมาก่อนเพราะการเพิ่มความถี่หรือคอร์เพิ่มเติมจะไม่ทำให้คุณเร็วขึ้นเมื่อเทียบกับอัลกอริธึมที่มีประสิทธิภาพ