การวิเคราะห์อัลกอริทึม  (Algorithm Analysis)
การวิเคราะห์อัลกอริทึม มีเป้าหมายเพื่อหาประสิทธิภาพของอัลกอริทึม นั่นคือการประมาณค่าทรัพยากรที่จำเป็นต้องใช้ในการทำงาน เช่น เวลา หรือ หน่วยความจำ อัลกอริทึมส่วนใหญ่ถูกออกแบบมาเพื่อให้สามารถรองรับจำนวนอินพุทได้ไม่จำกัด ปกติแล้วประสิทธิภาพ หรือความซับซ้อนของอัลกอริทึมจะวัดจากความสัมพันธ์ของจำนวนอินพุทกับเวลาที่ใช้ในการทำงาน หรือพื้นที่หน่วยความจำที่ใช้ (ในระยะหลังเรื่องของพื้นที่ไม่ถูกพิจารณามากนักเนื่องจากความก้าวหน้าในการพัฒนาหน่วยความจำ)
การออกแบบอัลกอริทึมเพื่อแก้ปัญหาใด ๆ เช่น การเรียงลำดับ สามารถทำได้หลายวิธี การประเมินประสิทธิภาพของอัลกอริทึม จะช่วยให้เราสามารถเลือกใช้อัลกอริทึมที่เหมาะสม
Asymptotic notation เครื่องหมายที่ใช้อธิบายการเติบโตของฟังก์ชั่น โดยในการวิเคราะห์อัลกอริทึมจะนำเครื่องหมายนี้มาใช้ในการระบุประสิทธิภาพของอัลกอริทึม มีหลายสัญลักษณ์ ดังนี้
Big-O Notation เครื่องหมาย บิ๊ก - โอ ใช้ในการระบุทรัพยากรที่ใช้ในการทำงานของอัลกอริทึมเมื่อขนาดของอินพุทเปลี่ยนไป ปกติแล้วทรัพยากรดังกล่าวจะหมายถึงเวลา นั่นคือ  ความสัมพันธ์ระหว่าง เวลา กับ ขนาดของอินพุท อาจกล่าวง่าย ๆ ว่า หากอินพุทมีขนาดใดขนาดหนึ่ง  เวลาที่ใช้ในการทำงานมากที่สุด  ( upper bound)   จะเป็นเท่าใด  บิ๊ก - โอ  เป็นฟังก์ชั่นที่นิยมใช้มากที่สุดในการระบุประสิทธิภาพของอัลกอริทึม
ตัวอย่าง ความหมายของ  O(n)  คือ ฟังก์ชั่นนั้น ๆ  ใช้เวลาทำงานช้าที่สุด   ≤  n  เช่น อัลกอริทึม  a1   มีประสิทธิภาพเป็น  O(n 2 )  ถ้า  n = 10  แล้ว  a1  จะใช้ เวลาทำงานช้าที่สุด  100  หน่วยเวลา   ( รับประกันว่าไม่ช้าไปกว่านี้  -  แต่อาจจะเร็วกว่านี้ได้ ) Big-O Notation
เขียนได้ว่า  f(n)  є   O(g(n))  เพื่อบอกว่า  f(n)  เป็น ฟังก์ชันที่ไม่โตเร็วกว่า   g(n) เราสามารถหาค่าคงตัวบวก  C  ที่  f(n) ≤ Cg(n)
Big-O Notation f(n)  є  O(g(n))  f(n) ≤(g(n))
Big-O Notation
โอเมก้าใหญ่  (Big-Omega   notation :  Ω ) โอเมก้าใหญ่ จะใช้สำหรับบอกถึง เวลาที่ใช้น้อยที่สุด (lower bound)   เมื่ออัลกอริทึมนั้น ๆ ทำงานกับอินพุทขนาดใดขนาดหนึ่ง  ตัวอย่าง ความหมายของ  Ω (n)  คือ ฟังก์ชั่นนั้น ๆ  ใช้เวลาทำงานเร็วที่สุด   ≥  n   เช่น อัลกอริทึม  a1   มีประสิทธิภาพเป็น  Ω (n)  ถ้า  n = 10  แล้ว  a1  จะใช้เวลา ทำงานเร็วที่สุด  10  หน่วยเวลา   ( รับประกันว่า ไม่เร็วไปกว่านี้  -  แต่อาจจะช้ากว่านี้ได้ )
เขียนได้ว่า  f(n)  є   Ω (g(n))  เพื่อบอกว่า  f(n)  เป็น ฟังก์ชันที่ไม่โตไม่ช้ากว่า   g(n) เราสามารถหาค่าคงตัวบวก  C  ที่  Cg(n) ≤ f(n)  โอเมก้าใหญ่  (Big-Omega   notation :  Ω )
โอเมก้าใหญ่  (Big-Omega   notation :  Ω ) f(n)  є   Ω (g(n)) Cg(n) ≤ f(n)
เตต้าใหญ่  (Big-Teta   notation :  Ө ) f(n) =  Ө (g(n))  ก็ต่อเมื่อ  f(n) = O(g(n))   และ  f(n) =  Ω (g(n)) นั่นคือ ขอบบนและขอบล่างเป็นฟังก์ชั่นเดียวกัน
เตต้าใหญ่  (Big-Teta   notation :  Ө ) f(n)  є   Ө (g(n)) C1g(n) ≤ f(n) ≤ C2g(n)
เตต้าใหญ่  (Big-Teta   notation :  Ө ) รูป  2.1  ความสัมพันธ์ระหว่างเวลาที่ใช้ กับจำนวนอินพุท ของฟังก์ชั่น  10n  ฟังก์ชั่น  5n+4  และ  3n สังเกตว่า  ขอบบน กับ ขอบล่าง เป็นฟังก์ชั่นเดียวกัน  สัมประสิทธิ์ต่างกัน ความหมายของเตต้าคือ  ใช้เวลาทำงาน  = n
โอเล็ก  (Little-o : o) Little-o   คือฟังก์ชั่นที่ไม่แตะขอบบน นั่นคือ ฟังก์ชั่นนี้  ทำงานช้าที่สุด  < n คือ  o(g(n))  คือเซตของฟังก์ชันที่โตช้ากว่า  g(n) เช่น หากเรามี  t(n) = n0.98 + 0.05√n  เราสามารถเขียนได้เป็น  O(n)  หรือ  o(n) แต่หากระบุเป็น  Little-o  จะเน้นให้เห็นชัดว่าไม่ถึง  n  ( เพราะค่ากำลังของ  n  คือ  1   แต่ในฟังก์ชั่น  t(n)  ค่ากำลังของ  n  คือ  0.98)
โอเมก้าเล็ก  (Little-omega :  ω ) Little-omega   คือฟังก์ชั่นที่ ไม่แตะขอบล่าง   นั่นคือ ฟังก์ชั่นนี้ ทำงานเร็วที่สุด  >   n คือ  ω (g(n))  คือเซตของฟังก์ชันที่ โตเร็วกว่า  g(n)
เปรียบเทียบ ลักษณะของฟังก์ชั่นของแต่ละสัญลักษณ์   รูป  2.2  สรุปเชิงเปรียบเทียบ ลักษณะของฟังก์ชั่นของแต่ละสัญลักษณ์   ≤  n <n ≥  n >n
การหาเทอมที่โตเร็วที่สุดในฟังก์ชั่น คือ  อัตราการเจริญเติบโตของฟังก์ชัน ที่แทนประสิทธิภาพของอัลกอริทึม รูปแบบของฟังก์ชั่นที่มักพบบ่อยได้แก่ exponential   อยู่ในรูป  a n polynomial   อยู่ในรูป  n a   (n  ยกกำลังค่าคงที่ )  เช่น  n 3 Linear  อยู่ในรูป  n logarithmic  อยู่ในรูป  log a n ทั้ง  4  รูปแบบ จะมีอัตราการเติบโตเรียงจากมากไปหาน้อย a n  >  n a  > n > log a n
อัตราการเจริญเติบโตของฟังก์ชัน 2 n n 2 n log2n รูป  2.3  กราฟแสดงการเติบโตของฟังก์ชั่น
อัตราการเจริญเติบโตของฟังก์ชัน
อัตราการเติบโตของฟังก์ชัน
อัตราการเติบโตของฟังก์ชัน ตามประสิทธิภาพของอัลกอริธึมจากมากสุด ( คือใช้เวลาน้อยที่สุด ) ไปหาน้อยสุด C  >  logN  >  Log 2 N  >  √N  >  N  >  N log N  >  N 2  >  N 3 … N k  >  2 n ,  c n  >  N!
อัตราการเจริญเติบโตของฟังก์ชัน ตย 1   จงเรียงลำดับฟังก์ชันต่อไปนี้ตามอัตราการเจริญเติบโต 0.5 n  , 1 , log n , n , 10 n จะได้ว่า 0.5 n  < 1 < log n < n < 10 n
ตย  2 จงเปรียบเทียบอัตราการเจริญเติบโตของ  n 10  , 2 n จะได้ว่า n 10  < 2 n อัตราการเจริญเติบโตของฟังก์ชัน
ตาราง  2.1  เปรียบเทียบเวลาการทำงานกับจำนวนอินพุท พิจารณาตารางจะพบว่า  O(1)  เป็นฟังก์ชั่นที่ให้ประสิทธิภาพดีที่สุด  นั่นคือ เวลาที่ใช้ในการทำงานไม่ขึ้นกับจำนวนอินพุท ในขณะที่  O(n)  จะให้ประสิทธิภาพในระดับกลาง  นั่นคือ อัตราการเติบโตของเวลาจะเป็นเส้นตรง เมื่ออินพุทมากขึ้น ก็จะใช้เวลามากขึ้น ในสัดส่วนที่เท่ากัน แต่  O(n 2 )  จะมีอัตราการเติบโตของเวลาสูงมากเมื่ออินพุทมีขนาดใหญ่ขึ้น   จากตาราง ประสิทธิภาพจะเรียงลำดับจากสูงไปหาต่ำ ประสิทธิภาพ สูง ต่ำ
การวิเคราะห์ประสิทธิภาพของอัลกอริทึม เราสามารถวิเคราะห์ประสิทธิภาพได้จากปริมาณคำสั่งที่ถูกใช้งานในโปรแกรม อาศัยเครื่องหมายที่กล่าวมาข้างต้นเป็นตัวกำกับ โดยการนับคำสั่งทั้งที่เป็นคำสั่งมูลฐาน และคำสั่งมาตรเวลา ซึ่งจะทำให้ได้ฟังก์ชั่นที่มีความละเอียดสูง จากนั้นจะค่อย ๆ ลดความซับซ้อนลง  โดยดูจากเทอมที่ใหญ่ที่สุดของฟังก์ชั่น ในกรณีที่ต้องการกำกับด้วย บิ๊ก - โอ
การวิเคราะห์ประสิทธิภาพของอัลกอริทึม
การวิเคราะห์ประสิทธิภาพของอัลกอริทึม ตย อัลกอริทึม  1 Sum := 0; for I:=1 to n do Sum := Sum+I; f(n)  =  O(n)
ตย . อัลกอริทึม  3 Sum := (1+n)*n/2; การวิเคราะห์ประสิทธิภาพของอัลกอริทึม f(n)  = O(1)
 
การหาค่า  Big-Oh หาได้โดยนำ  f(n)  มากระทำดังนี้ 1.  ตัดสัมประสิทธิ์ของแต่ละเทอมทิ้ง 2.  เลือกเทอมที่ใหญ่สุดเก็บไว้เป็นคำตอบ ตัวอย่างเช่น  f(n) =  3n 4  + 2n 2  + n n 4  +  n 2  + n n 4 O(f(n)) =
เมื่อพิจารณาจาก  f(n)  จะพบว่า อัลกอริทึม  1 f(n) = n อัลกอริทึม  2 f(n) = n-1 อัลกอริทึม  3 f(n) = 1 ประสิทธิภาพ ต่ำสุด ประสิทธิภาพ ดีสุด
การหาค่า  Big-Oh ตย  จงหาค่า  Big-o  ของ  n 3 +2n 3 +10 1.  ตัดสัมประสิทธิ์ของแต่ละเทอมทิ้ง จะได้   n 3 +n 3 2.  เลือกเทอมที่ใหญ่สุดเก็บไว้เป็นคำตอบ O(f(n)) =   O ( n 3 )
การหาค่า  Big-Oh ตย  จงหาค่า  Big-o  ของ  100 F(n) = 100 O(f(n)) =   O( 1 )  ตย  จงหาค่า  Big-o  ของ  100N+1 F(n) = 100N+1   O(f(n)) =   O( N )
การหาค่า  Big-Oh ตย  จงหาค่า  Big-o  ของ  20nlogn+5n = O(nlogn) F(n) = 20nlogn+5n  F(n) = nlogn+n O(f(n)) =   =  O(nlogn)
สมมติให้แต่ละโปรแกรมใช้เวลาในการทำงานเป็นดังนี้  prg1 = 3n 2 +2n  prg2 = 2log 2 n+6n+n prg3 = n+nlog 2 n+4n+9 จงแสดง  Big-O  ของแต่ละโปรแกรมพร้อมทั้งเรียงลำดับประสิทธิภาพของโปรแกรมจากดีสุดไปหาช้าสุด 2Log 2 n  < nlog 2 n < 3n 2 จะได้  1.   prg2  2.   prg3   3.prg1 การวิเคราะห์ประสิทธิภาพของอัลกอริทึม

การวิเคราะห์อัลกอริทึม