บทที่ 2 การวิเคราะห์ประสิทธิภาพของอัลกอริทึม (Performance Analysis).

Download Report

Transcript บทที่ 2 การวิเคราะห์ประสิทธิภาพของอัลกอริทึม (Performance Analysis).

บทที ่ 2 การวิเคราะห์
ประสิทธิภาพของอัลกอริทึม
(Performance Analysis)
1
บทที่ 2 การวิเคราะห์ ประสิทธิภาพของอัลกอริทมึ
• คณิตศาสตร์พน้ื ฐานสาหรับการวิเคราะห์ประสิทธิภาพของ
อัลกอริทมึ อะไร
• การวัดประสิทธิภาพอัลกอริทมึ
• อัตราการเติบโตของอัลกอริทมึ (Algorithm Growth Rates)
• เปรียบเทียบอัตราการเติบโตของอัลกอริทมึ
• การนับตัวดาเนินการ (Operation Counts)
• ฟงั ก์ชนั อัตราการเติบโตตามการวัดประสิทธิภาพของอัลกอริทมึ
• การวิเคราะห์ Best-case, Worst-case และ Average-case
• สรุปเนื้อหาบทที่ 2
2
คณิตศาสตร์พน้ื ฐานสาหรับการวิเคราะห์ประสิทธิภาพของอัลกอริทมึ
ลอการิทึม (Logarithms)
การจัดการข้อมูลในหน่วยความจาหรือในดิสก์ให้มคี วามสัมพันธ์ลอการิทมึ ของค่า y ฐาน b
จะเขียนอยูใ่ นรูปลอการิทมึ ได้ คือ 𝑙𝑜𝑔𝑏 𝑦 = 𝑥
ดังนัน้ ถ้า log 𝑏 𝑦 = 𝑥 แล้ว 𝑏 𝑥 = 𝑦 และ b logb y = y
ตัวอย่างเช่น log 2 1000 = 10 หาได้จาก 210 =1000
คุณสมบัตขิ องลอการิทมึ มีดงั นี้
1. log 𝑛𝑚 = log 𝑛 + log 𝑚
2. log 𝑛/𝑚 = log 𝑛 − log 𝑚
3. log 𝑛𝑟 = 𝑟 log 𝑛
4. log 𝑎 𝑛 =
log𝑏 𝑛
log𝑏 𝑎
3
คณิตศาสตร์พน้ื ฐานสาหรับการวิเคราะห์ประสิทธิภาพของอัลกอริทมึ
ผลรวม (Summation)
การบวกตัวเลขทีอ่ ยูใ่ นช่วงของกลุ่มข้อมูลโดยใช้สญ
ั ลักษณ์ ซิกมา ( : Sigma)
𝑛
𝑖=1 𝑓
𝑖 = 𝑓 1 + 𝑓 2 + ⋯ + 𝑓 𝑛 − 1 + 𝑓(𝑛)
เลขยกกาลัง (Logarithm)
• การบวกเลขยกกาลัง
n2+3n+n2+n+1 = (n2+n2)+(3n+n)+1 = 2n2+4n+1
• การคูณเลขยกกาลัง
n*(n+1) = n2+n
4
การวัดประสิทธิภาพอัลกอริทมึ
•
•
•
วัตถุประสงค์แรกในการพัฒนาโปรแกรม
- พัฒนาขึน้ มาต้องทางานถูกต้องและได้ผลลัพธ์ตามต้องการ
สิง่ ทีต่ อ้ งพิจารณาหลังพัฒนาโปรแกรม
- ใช้เวลาในการประมวลผลนานเกินไปหรือไม่
- ใช้หน่วยความจามากเกินความจาเป็ นหรือไม่
เครือ่ งมือทีใ่ ช้ในการวัดประสิทธิภาพอัลกอริทมึ
- การวิเคราะห์หน่วยความจาทีใ่ ช้ในการประมวลผล (Space Complexity Analysis)
- การวิเคราะห์เวลาทีใ่ ช้ในการประมวลผล (Time Complexity Analysis)
5
การวัดประสิทธิภาพอัลกอริทมึ
การวิเคราะห์หน่ วยความจาที่ใช้ในการประมวลผล
(Space Complexity Analysis)
• การวิเคราะห์หน่วยความจาทัง้ หมดทีโ่ ปรแกรมใช้ในการประมวลผลของอัลกอริทมึ
• เพือ่ ให้ทราบถึงขนาดข้อมูลทีส่ ามารถป้อนหรือส่งข้อมูลเข้ามาให้อลั กอริทมึ ประมวลผล
แล้วไม่เกิดข้อผิดพลาด
6
การวัดประสิทธิภาพอัลกอริทมึ
การวิเคราะห์หน่ วยความจาที่ใช้ในการประมวลผล
(Space Complexity Analysis)
 องค์ประกอบของการวิเคราะห์หน่ วยความจาที่ใช้ในการประมวล
• Instruction Space คือ ขนาดหน่วยความจาทีจ่ าเป็ นต้องใช้ขณะคอมไพเลอร์
(Compiler) โปรแกรม
• Data Space คือ ขนาดหน่วยความจาทีจ่ าเป็ นต้องใช้สาหรับเก็บข้อ มูลค่าคงที่
และตัวแปรทีใ่ ช้ในขณะประมวลผลโปรแกรม ซึง่ แยกออกได้ 2 ประเภท คือ
o Static memory ขนาดหน่ วยความจาทีต่ ้องใช้ในการประมวลผลอย่าง
แน่นอน เช่น หน่วยความจาทีใ่ ช้เก็บค่าคงที่ หรือตัวแปรชนิดอาร์เรย์
o Dynamic memory ขนาดหน่ วยความจาทีต่ อ้ งใช้ในการประมวลผลทีไ่ ม่
แน่นอน คือ จะรูว้ า่ ต้องใช้หน่วยความจาเท่าไรก็ต่อเมือ่ โปรแกรมต้องใช้งาน
นัน้ เอง เช่น การประกาศตัวแปรพอยเตอร์ (Pointer) ในภาษา C หรือการ
เก็บข้อมูลในรูปแบบลิงค์ลสิ ต์ทส่ี ามารถเพิม่ หรือลดขนาดการเก็ บข้อมูลได้
แบบอัตโนมัตโิ ดยไม่ตอ้ งจองพืน้ ทีห่ น่วยความจาไว้ก่อนใช้งาน
7
การวัดประสิทธิภาพอัลกอริทมึ
การวิเคราะห์หน่ วยความจาที่ใช้ในการประมวลผล
(Space Complexity Analysis)
 องค์ประกอบของการวิเคราะห์หน่ วยความจาที่ใช้ในการประมวล
• Environment Stack Space คือ หน่วยความจาทีใ่ ช้สาหรับเก็บข้อมูลผลลัพธ์ท่ี
ได้จ ากการประมวลผล เพื่อ รอเวลาที่จ ะน ากลับ ไปใช้ใ หม่ ใ นโปรแกรม ซึ่ ง
หน่วยความจาประเภทนี้จะเกิดขึน้ เมือ่ มีการใช้งานเท่านัน้
8
การวัดประสิทธิภาพอัลกอริทมึ
การวิเคราะห์หน่ วยความจาที่ใช้ในการประมวลผล
(Space Complexity Analysis)
ตัวอย่างที่ 2.1 วิเคราะห์หน่วยความจาทีใ่ ช้ในการประมวลผลของโค้ดต่อไปนี้
1 +SpaceAnalysis(in data1:int,in data2:int):int
2
int temp
3
temp = data1 + data2
4
return temp
• ประกาศตัวแปรทัง้ หมด 3 ตัวแปร คือ data1, data2 และ temp
• ทัง้ สามตัวแปรมีชนิดข้อมูล คือ integer (ภาษา Java ขนาด 4 ไบต์, ภาษา C ขนาด 2 ไบต์)
• ใช้พน้ื ทีห่ น่วยความจา 3*4 = 12 ไบต์ (ภาษา C ใช้หน่วยความจา 3*2 = 6 ไบต์)
9
การวัดประสิทธิภาพอัลกอริทมึ
การวิเคราะห์หน่ วยความจาที่ใช้ในการประมวลผล
(Space Complexity Analysis)
ตัวอย่างที่ 2.2 วิเคราะห์หน่วยความจาทีใ่ ช้ในการประมวลผลของโปรแกรมแบบวนซ้า
1 +Factorial(in n:int):int
2
if (n == 0)
3
return 1
4
else return n * (Factorial(n-1))
• พิจารณาตามจานวนรอบทีว่ นซ้า ถ้ากาหนดให้ n มีคา่ เท่ากับ 3 จะต้องทาการวนซ้า 3 ครัง้
• ใช้พน้ื ทีใ่ นหน่วยความจา เท่ากับ 3 * 4 = 12 ไบต์ (ภาษจาวา)
• สรุปได้วา่ ถ้ากาหนดให้หาค่าแฟคทอเรียล n จะต้องใช้พน้ื ทีห่ น่วยความจาเท่ากับ n * 4
ไบต์ (ภาษา Java ) ในการคานวณหาค่าแฟคทอเรียล n
10
การวัดประสิทธิภาพอัลกอริทมึ
การวิเคราะห์เวลาที่ใช้ในการประมวลผล (Time Complexity Analysis)
•
•
•
•
การวิเคราะห์ขนตอนของการด
ั้
าเนินการทีต่ อ้ งใช้ในการประมวลผลของอัลกอริทมึ
เพือ่ ใช้ประมาณการเวลาทีใ่ ช้ประมวลผล
ทราบถึงประสิทธิภาพการทางานของโปรแกรมและแก้ไขปญั หาได้อย่างถูกต้อง
สามารถนาไปใช้เลือกเครือ่ งคอมพิวเตอร์ทเ่ี หมาะสมกับการประมวลผลของอัลกอริทมึ
 หลักการพิจารณาเวลาที่ใช้ประมวลผล
• เมือ่ ประมวลผลโปรแกรมในเครือ่ งคอมพิวเตอร์ทม่ี ปี ระสิทธิภาพเร็วกว่าก็จะประมวลผล
ข้อมูลได้เร็วกว่า
• เมือ่ รันโปรแกรมทีม่ ผี ลการทางานเดียวกัน โปรแกรมทีม่ โี ค้ดน้อยกว่าจะทางานได้เร็วกว่า
• ตัวแปรทีม่ ขี นาดหน่วยความจาเล็กว่าจะประมวลผลได้เร็วกว่า
11
การวัดประสิทธิภาพอัลกอริทมึ
การวิเคราะห์เวลาที่ใช้ในการประมวลผล (Time Complexity Analysis)
 ประเภทของเวลาที่ใช้ในการประมวลผล
• Compile time เป็ นเวลาทีใ่ ช้ในการตรวจไวยากรณ์ (Syntax)
• Run time หรือ Execution time เป็ นเวลาทีเ่ ครือ่ งคอมพิวเตอร์ใช้ในการประมวลผล
อัลกอริทมึ ซึง่ ขึน้ อยูก่ บั ชนิดข้อมูล, จานวนตัวแปรทีใ่ ช้ในโปรแกรม และจานวนลูป
12
การวัดประสิทธิภาพอัลกอริทมึ
การวิเคราะห์เวลาที่ใช้ในการประมวลผล (Time Complexity Analysis)
ตัวอย่างที่ 2.3 วิเคราะห์เวลาทีใ่ ช้ในการประมวลผลของโค้ดต่อไปนี้
1
2
3
4
5
6
7
int n = 20;
int total = 0;
while(n != 20){
total += n;
++n;
} //end while
System.out.println(“ผลรวม = ” + total);
 กาหนดค่า 1 ครัง้
 กาหนดค่า 1 ครัง้
 เปรียบเทียบ n+1 ครัง้
 คานวณ n ครัง้
 คานวณ n ครัง้
 แสดงผล 1 ครัง้
กาหนดให้ f(n) แทนประสิทธิภาพในการวิเคราะห์เวลาทีใ่ ช้ในการประมวลผล
n แทนจานวนรอบในการทางาน
จะได้วา่ อัลกอริทมึ นี้มปี ระสิทธิภาพ
f(n) = 1 + 1 + (n + 1) + n + n + 1 = 3 n +4
13
การวัดประสิทธิภาพอัลกอริทมึ
การวิเคราะห์เวลาที่ใช้ในการประมวลผล (Time Complexity Analysis)
ตัวอย่างที่ 2.4 วิเคราะห์เวลาทีใ่ ช้ในการประมวลผลของโปรแกรมแบบวนซ้า
1 +Factorial(in n:int):int
if (n == 0)
2
return 1
3
else return n * (Factorial(n-1))
4
 ถูกเรียกใช้ n ครัง้
 ตรวจสอบเงือ่ นไข n ครัง้
 คืนค่า 1 ครัง้
 เรียกใช้ตวั เอง n ครัง้
f(n) = n + n + 1 + n = 3n +1
14
อัตราการเติบโตของอัลกอริทมึ (Algorithm Growth Rates)
• เครือ่ งมือในการวัดประสิทธิภาพของอัลกอริทมึ เช่น Big-O, Big-Omega, Big-Teta, Little-o
และ Little-omga
อัตราการเติบโต Big-O
•
•
•
•
เป็ นการวัดประสิทธิภาพเชิงเวลาทีใ่ ช้ในการประมวลผลของอัลกอริทมึ
เป็ นฟงั ก์ชนั เวลาขอบเขตบนทีใ่ ช้ในการประมวลผล (Asymptotic upper bounds)
สัญลักษณ์เป็ นตัวโอใหญ่ (O)
O(n) หมายถึง ฟงั ก์ชนั นี้จะใช้เวลาในการประมวลผลน้อยกว่าหรือเท่ากับ n (<n) เสมอ
15
อัตราการเติบโตของอัลกอริทมึ (Algorithm Growth Rates)
อัตราการเติบโต Big-O
นิยาม Big-O
ฟงั ก์ชนั f(n) = O(g(n)) ก็ต่อเมือ่ มีคา่ คงที่ m,c ทีท่ าให้ f(n) < cg(n) เมือ่ n > m
16
อัตราการเติบโตของอัลกอริทมึ (Algorithm Growth Rates)
อัตราการเติบโต Big-O
ตัวอย่างที่ 2.5 กาหนดให้ f(n) = 5n4 – 37n3 + 13n – 4 สามารถแสดงการหาค่า Big-O และ
ค่าคงที่ c กับ m ได้ดงั นี้
จาก f(n) = |5n4-37n3+13n–4| < c|n4| โดยที่ n > m จะได้วา่
เมือ่ กาหนดให้ m = 1 จะทาให้ n > 1 สามารถทาให้การดาเนินการถูกต้องได้ดงั นี้
|5n4-37n3+13n–4| < |5n4+37n4+13n4+ 4n4| (เนื่องจาก 37n4 > 37n3)
< 59|n4|
เพราะฉะนัน้ |5n4-37n3+13n–4| < 59|n4| เมือ่ n > 1
ดังนัน้ f(n) = 5n4 – 37n3 + 13n – 4 ∈ O(n4)
จึงได้วา่ c = 59, n = 1 และ Big-O คือ O(n4)
Note
สรุปแนวคิดการหา Big-O จะพิจารณาค่าทีม่ ผี ลกระทบมากทีส่ ุดเพียงค่าเดียว ซึง่ ค่าคงที่ c
มีผลน้อยกว่าค่าทีม่ ผี ลกระทบมากทีส่ ุด ดังนัน้ จึงนาค่าทีม่ ผี ลกระทบมากทีส่ ุดเป็ นค่าของตัว
วัดประสิทธิภาพของ Big-O
17
อัตราการเติบโตของอัลกอริทมึ (Algorithm Growth Rates)
อัตราการเติบโต Big-Omega (  )
• เป็ นการวัดประสิทธิภาพเชิงเวลาทีใ่ ช้ในการประมวลผลของอัลกอริทมึ
• เป็ นฟงั ก์ชนั เวลาขอบเขตล่างทีใ่ ช้ในการประมวลผล (Asymptotic lower bounds)
• สัญลักษณ์เป็ นตัวโอเมก้าใหญ่ (  )
•  (n) หมายถึง ฟงั ก์ชนั นี้จะใช้เวลาในการประมวลผลมากกว่าหรือเท่ากับ n (> n) เสมอ
18
อัตราการเติบโตของอัลกอริทมึ (Algorithm Growth Rates)
อัตราการเติบโต Big-Omega (  )
นิยาม Big-Omega
ฟงั ก์ชนั f(n) = (g(n)) ก็ต่อเมือ่ มีคา่ คงที่ m,c ทีท่ าให้ f(n) > cg(n) เมือ่ n > m
19
อัตราการเติบโตของอัลกอริทมึ (Algorithm Growth Rates)
อัตราการเติบโต Big-Omega (  )
ตัวอย่างที่ 2.6 กาหนดให้ f(n) = 5n4 – 37n3 + 13n – 4 สามารถแสดงการหาค่า Big- 
และค่คงที่ c กับ m ได้ดงั นี้
จาก f(n) = |5n4-37n3+13n–4| > c|n| โดยที่ n < m จะได้ว่า
เมื่อกาหนดให้ m = 1 จะทาให้ n > 1 สามารถทาให้การดาเนินการถูกต้องได้ดงั นี้
|5n4-37n3+13n–4| > |5n+37n+13n+4n|
> 59|n|
เพราะฉะนัน้ |5n4-37n3+13n–4| > 59|n| เมื่อ n > 1
จึงได้ว่า c = 59, n = 1 และ Big-  คือ  (n)
Note
สรุปแนวคิดการหา Big- จะพิจารณาค่าทีม่ ผี ลกระทบน้อยทีส่ ุดเพียงค่าเดียว ซึ่งค่าคงที่ c มี
ผลมากกว่าค่าทีม่ ผี ลกระทบน้อยทีส่ ุด ดังนัน้ จึงนาค่าทีม่ ผี ลกระทบน้อยที่ สุดเป็ นค่าของตัววัด
ประสิทธิภาพของ Big- 
20
อัตราการเติบโตของอัลกอริทมึ (Algorithm Growth Rates)
อัตราการเติบโต Big-Theta ()
• เป็ นการวัดประสิทธิภาพเชิงเวลาทีใ่ ช้ในการประมวลผลของอัลกอริทมึ
• เป็ นฟงั ก์ชนั เวลาขอบเขตบนและขอบเขตล่างทีใ่ ช้ในการประมวลผล (Asymptotic lower bounds)
• สัญลักษณ์เป็ นตัวเทต้าใหญ่ (  )
• (n) หมายถึง ฟงั ก์ชนั นี้จะใช้เวลาในการประมวลผลระหว่าง Big- และ Big-O เสมอ
21
อัตราการเติบโตของอัลกอริทมึ (Algorithm Growth Rates)
อัตราการเติบโต Big-Theta ()
นิยาม Big- Theta
ฟงั ก์ชนั f(n) =  (g(n)) ก็ต่อเมือ่ มีคา่ คงที่ c1, c2 และ m ทีท่ าให้ c1g(n) < f(n) < c2g(n) เมือ่ n > m
โดยทีฟ่ งั ก์ชนั c1g(n) คือขอบเขตด้านล่าง  (g(n))
c2g(n) คือขอบเขตด้านบน O(g(n))
22
อัตราการเติบโตของอัลกอริทมึ (Algorithm Growth Rates)
อัตราการเติบโต Big-Theta ()
ตัวอย่างที่ 2.7 กาหนดให้ f(n) = 5n4 – 37n3 + 13n – 4 สามารถแสดงการหาค่า Big-  และ
ค่าคงที่ c1, c2 กับ m ได้ดงั นี้
จาก f(n) = c|n| < |5n4-37n3+13n–4| < c|n4| โดยที่ n < m จะได้ว่า
เมื่อกาหนดให้ m = 1 จะทาให้ n > 1 สามารถทาให้การดาเนินการถูกต้องได้ดงั นี้
|5n+37n+13n+4n| < |5n4-37n3+13n–4| < |5n4+37n4+13n4+4n4|
59|n| < |5n4-37n3+13n–4| < 59|n4|
เพราะฉะนัน้ 59|n| < |5n4-37n3+13n–4| < 59|n4| เมื่อ n > 1
จึงได้ว่า c1 = 59, c2 = 59, n = 1 และ Big-  มีค่าระหว่าง O(n4),  ( n)
Note
สรุปแนวคิดการหา Big- เป็ นการหาผลกระทบทีอ่ ยู่ระหว่าง Big-O กับ Big-  โดย
พิจารณาค่าที่มผี ลกระทบน้ อยที่สุดเพียงค่าเดียว ซึ่งค่าคงที่ c1 มีผลมากกว่าค่าที่ม ี
ผลกระทบน้อยทีส่ ุด และเมือ่ พิจารณาค่าทีม่ ผี ลกระทบมากทีส่ ุดเพียงค่าเดียว คือค่าคงที่ c2
23
อัตราการเติบโตของอัลกอริทมึ (Algorithm Growth Rates)
อัตราการเติบโต Little-o
•
•
•
•
เป็ นการวัดประสิทธิภาพเชิงเวลาทีใ่ ช้ในการประมวลผลของอัลกอริทมึ
มีขอบเขตการเวลาทีใ่ ช้ประมวลผลคล้ายกับ Big-O แต่ไม่แตะขอบเขตบนของฟงั ก์ชนั เวลา
สัญลักษณ์เป็ นตัวโอเล็ก (o)
o(n) หมายถึง ฟงั ก์ชนั นี้จะใช้เวลาในการประมวลผลน้อยกว่า n (< n) เสมอ
24
อัตราการเติบโตของอัลกอริทมึ (Algorithm Growth Rates)
อัตราการเติบโต Little-omega
•
•
•
•
เป็ นการวัดประสิทธิภาพเชิงเวลาทีใ่ ช้ในการประมวลผลของอัลกอริทมึ
มีขอบเขตการเวลาทีใ่ ช้ประมวลผลคล้ายกับ Big-Omega แต่ไม่แตะขอบเขตล่างของฟงั ก์ชนั เวลา
สัญลักษณ์เป็ นตัวโอเมกาเล็ก ( )
 (n) หมายถึง ฟงั ก์ชนั นี้จะใช้เวลาในการประมวลผลมากกว่า n (> n) เสมอ
25
เปรียบเทียบอัตราการเติบโตของอัลกอริทมึ





Big-O (O) มีช่วงเวลาทางานทีน่ ้อยกว่าหรือเท่ากับ n
Big-Omega (  ) มีช่วงเวลาทางานทีม่ ากกว่าหรือเท่ากับ n
Big-Teta (  ) มีช่วงเวลาทางานอยู่ระหว่าง Big-O และ Big-Omega
Little-o (o) มีช่วงเวลาทางานทีน่ ้อยกว่า n
Little-omega (  ) มีช่วงเวลาทางานทีม่ ากกว่า n
26
การนับตัวดาเนินการ (Operation Counts)
นับตัวดาเนินการแบบค่าคงที่ (Constant)
ตัวอย่าง 2.8 การนับตัวดาเนินการแบบค่าคงที่
1
2
count = 0;
Total = (1+n)*(n/2);
1
1
f(n) = 1+1 = 2 จึงได้วา่ Big-O = O(2)
27
การนับตัวดาเนินการ (Operation Counts)
นับตัวดาเนินการแบบลูปลาดับ (Linear loops)
ตัวอย่าง 2.9 การนับตัวดาเนินการแบบลูปลาดับ กาหนดให้ n = 3
1
2
3
4
Total = 0;
for (i = 0; i < n; i++){
Total = Total+i;
}
1
 n+1
n
ค่า i
ตรวจ อบเงื่อน ข i < n บรรทัด Total = Total + i
0


1


2


3


4


4
3
จานวนครังที่ทา
f(n) = 1 + n + 1 + n = 2n + 2 จึงได้วา่ Big-O = O(n)
28
การนับตัวดาเนินการ (Operation Counts)
นับตัวดาเนินการแบบลูปลาดับ (Linear loops)
ตัวอย่าง 2.10 การนับตัวดาเนินการแบบลูปลาดับ กาหนดให้ n = 3
1
2
3
4
Total = 0;
for (i = 1; i < n; i++){
Total = Total+i;
}
ค่า i
1
2
3
4
จานวนครังที่ทา
1
n
n-1
ตรวจ อบเงื่อน ข i < n




3
บรรทัด Total = Total + i




2
f(n) = 1 + n + n - 1 = 2n จึงได้วา่ Big-O = O(n)
29
การนับตัวดาเนินการ (Operation Counts)
นับตัวดาเนินการแบบลูปลาดับ (Linear loops)
ตัวอย่าง 2.11 การนับตัวดาเนินการแบบลูปลาดับ กาหนดให้ n = 3
1
2
3
4
Total = 0;
for (i = 0;i <= n; i++){
Total = Total+i;
}
1
n+2
n+1
ค่า i
ตรวจ อบเงื่อน ข i < n บรรทัด Total = Total + i
0


1


2


3


4


5


5
4
จานวนครังที่ทา
f(n) = 1 + n + 2 + n + 1 = 2n + 4 จึงได้วา่ Big-O = O(n)
30
การนับตัวดาเนินการ (Operation Counts)
นับตัวดาเนินการแบบลูปลาดับ (Linear loops)
ตัวอย่าง 2.12 การนับตัวดาเนินการแบบลูปลาดับ กาหนดให้ n = 4
1
Total = 0;
1
2
for (i = 0;i < n; i = i+2){

3
…
4
5
…
}
ค่า i
ตรวจ อบเงื่อน ข i < n บรรทัดที่ 3
0


1
ไม่พจิ ารณา
2


3
ไม่พจิ ารณา
4


5
ไม่พจิ ารณา
6


3
2
จานวนครังที่ทา
𝑛
+ 1
2
𝑛

2
𝑛

2
𝑛
2
𝑛 𝑛
f(n) = 1 + +1 + +
2 2
𝑛
จึงได้วา่ Big-O = O( )
2
=
𝑛
3
2
+2
31
การนับตัวดาเนินการ (Operation Counts)
นับตัวดาเนินการแบบลูปลอการิทึม (Logarithmic loops)
• ค่าตัวแปรทีท่ าหน้าทีเ่ ป็ นเงื่อนไขของลูปจะมีการเพิม่ ขึน้ หรือลดลงด้วยการคูณหรือ
การหารเป็ นอัตราเท่าตัว
ตัวอย่าง 2.13 การนับตัวดาเนินการแบบลูปลอการิทมึ
1
2
3
4
5
Total = 0;
for(i=1;i<10;i=i*2){
…
…
}
รอบที่
1
2
3
4
5
จานวนครังที่ทา
ค่า i
1
2
4
8
16
เพิ่ มขึนด้วยการคูณ
บรรทัดที่ 2 บรรทัดที่ 3










5
4
1
log 2 n + 1
log 2 n
log 2 n
f(n) = 1 + log2 n + 1 + log2 n + log2 n
= 3 log2 n + 2
จึงได้วา่ Big-O = O(log2 n)
32
การนับตัวดาเนินการ (Operation Counts)
นับตัวดาเนินการแบบลูปลอการิทึม (Logarithmic loops)
ตัวอย่าง 2.14 การนับตัวดาเนินการแบบลูปลอการิทมึ
1
2
3
4
5
Total = 0;
for(i=10;i>0;i=i/2){
…
…
}
รอบที่
1
2
3
4
5
จานวนครังที่ทา
1
log 2 n + 1
log 2 n
log 2 n
ลดด้วยการหาร
ค่า i บรรทัดที่ 2 บรรทัดที่ 3
10


5


2


1


0


5
4
f(n) = 1 + log2 n + 1 + log2 n + log2 n
= 3 log2 n + 2
จึงได้วา่ Big-O = O(log2 n)
33
การนับตัวดาเนินการ (Operation Counts)
นับตัวดาเนินการแบบลูปซ้อน (Nested loops)
• Quadratic
ตัวอย่าง 2.15 การนับตัวดาเนินการของลูปซ้อนแบบ Quadratic กาหนดให้ n = 2
1
2
3
4
5
6
7





Total = 0;
for (i = 0;i < n; i++){
for (j = 0; j < n; j++){
…
…
}
}
ค่า i ค่า j เงื่อน ข i < n
0
0

0
1

0
2

1
0

1
1

1
2

2
0

n+1 = 3
จานวนครังที่ทา
เงื่อน ข j < n







n*(n+1) = 6
บรรทัดที่ 4







n*n = 4
1
n +
n(n
n*n
n*n
1
+ 1) = n2+n
= n2
= n2
f(n) = 1 + n + 1 + n(n+1) + n2 + n2
= 3n2 + 2n + 2
จึงได้วา่ Big-O = O(n2)
34
การนับตัวดาเนินการ (Operation Counts)
นับตัวดาเนินการแบบลูปซ้อน (Nested loops)
• Linear Logarithmicc
ตัวอย่าง 2.16 การนับตัวดาเนินการของลูปซ้อนแบบ Linear Logarithmic กาหนดให้ n = 2
1
2
3
4
5
6
7
Total = 0;
for (i = 0;i < n; i++){
for (j = 1; j < n; j=j*2){
…
…
}
}





1
n + 1
n(log 2 n + 1)
n*log 2 n
n*log 2 n
ค่า i j = j * 2 เงื่อน ข i < n เงื่อน ข j < n
บรรทัดที่ 4
0
1



0
2



1
1



1
2



2
1



จานวนครังที่ทา 3 = n+1 4 = n*(log 2 n+1) 2 = n*log 2 n
f(n) = 1 + n + 1 + n(log 2 n+1) + nlog2 n + nlog 2 n = 3nlog2 n+n+2
จึงได้วา่ Big-O = O(nlog2 n)
35
การนับตัวดาเนินการ (Operation Counts)
นับตัวดาเนินการแบบลูปซ้อน (Nested loops)
• Dependent Quadratic
ตัวอย่าง 2.17 การนับตัวดาเนินการของลูปซ้อนแบบ Dependent Quadratic กาหนดให้ n = 2
1
2
3
Total = 0;
for (i = 0;i < n; i++){
for(j = 0; j < i; j++){
 1
 n + 1
𝑛+1
 𝑛
+1
4
…
 𝑛
5
6
7
…
𝑛
}
2
𝑛+1
2
𝑛+1
2
}
ค่า i
ค่า j
0
0
0
1
1
0
1
1
1
2
2
0
จานวนครังที่ทา
เงื่อน ข i < n






3 = n+1
เงื่อน ข j < i






n+1
5=n 2 +1
บรรทัดที่ 4






n+1
3=n 2
f(n) = 1+ n + 1 + n n+1
+1 +
2
n+1
n+1
n 2 +n 2
= 3n n+1
+ 2n + 2
2
จึงได้วา่ Big-O = O n n+1
2
36
ฟงั ก์ชนั อัตราการเติบโตตามการวัดประสิทธิภาพของอัลกอริทมึ
f(n)
C
log 2 n
n
n log 2 n
n2
n3
nk
2n
n!
แบบการนับตัวดาเนินการ
ประ ิ ท ิ ภาพ
เรวที่ ด
ค่าคงที่ (Constant)
ฟงั ก์ชนั ลอการิทมึ (Logarithmic loops)
ฟงั ก์ชนั เชิงเส้น (Linear loops)
ฟงั ก์ชนั ลอการิทมึ เชิงเส้น (Linear Logarithmic)
ฟงั ก์ชนั กาลังสอง (Quadratic)
ฟงั ก์ชนั กาลังสาม (Cubic)
ฟงั ก์ชนั โพลีโนเมียล (Polynamial)
ฟงั ก์ชนั เอ็กโพแนนเซียล (Exponential)
ช้าที่ ด
ฟงั ก์ชนั แฟคทอเรียล (Factorial)
37
ฟงั ก์ชนั อัตราการเติบโตตามการวัดประสิทธิภาพของอัลกอริทมึ
38
การวิเคราะห์ Best-case, Worst-case และ Average-case
Base-case
การวิเคราะห์หาประสิทธิภาพทีด่ ที ส่ี ุดในการประมวลผลของอัลกอริทมึ เช่น การค้นหาข้อมูล
ในอาร์เรย์ แล้วเจอข้อมูลในการตรวจสอบครัง้ แรก
Worst case
การวิเคราะห์หาประสิทธิภาพที่แย่ท่สี ุดในการประมวลผลของอัลกอริทมึ เช่น การค้นหา
ข้อมูลในอาร์เรย์ แล้วเจอข้อมูลในการตรวจสอบครัง้ สุดท้าย เป็ นต้น แสดงว่ากรณีน้ีเป็ นกรณี
ทีแ่ ย่ทส่ี ุดเพราะต้องตรวจสอบข้อมูลจนถึงครัง้ สุดท้ายจึงจะพบข้อมูลทีต่ อ้ งการ
Average-case
การหาค่าเฉลีย่ ของเวลาทีใ่ ช้ประมวลผลของอัลกอริทมึ
39
สรุปเนื้อหาบทที่ 2
• การวิเคราะห์ประสิทธิภาพคือการวิเคราะห์กรณีโอกาสที่แย่ท่สี ุดในการทางานของ
โปรแกรมที่พฒ
ั นา เพื่อเป็ นการรับประกันได้ว่าการทางานของโปรแกรมจะไม่ เ กิด
โอกาสทีแ่ ย่ไปกว่านี้ โดยใช้อตั ราการเติบโต Big-O เป็ นการวัดประสิทธิภาพเชิงเวลาที่
ใช้ในการประมวลผลของอัลกอริทมึ
• ประสิท ธิภ าพของอัล กอริทึม จะพิจ ารณาได้จากตัว บ่ง ชี้ 3
ตัว คือ Best-case,
Worst-case และ Average-case
40