1.09k likes | 1.35k Views
บทที่ 2 การวิเคราะห์อัลกอริทึม. หัวข้อ. การวิเคราะห์อัลกอริทึม แบบทดลอง และ แบบคณิตวิเคราะห์ การนับจำนวนการทำงานของคำสั่งพื้นฐาน อัตราการเติบโตของฟังก์ชัน สัญกรณ์ เชิงเส้นกำกับ การวิเคราะห์การทำงาน แบบลำดับ, แบบเลือกทำ, แบบวงวน, แบบเรียกซ้ำ. ขั้นตอนการออกแบบอัลกอริทึม.
E N D
บทที่ 2การวิเคราะห์อัลกอริทึม
หัวข้อ • การวิเคราะห์อัลกอริทึม • แบบทดลอง และแบบคณิตวิเคราะห์ • การนับจำนวนการทำงานของคำสั่งพื้นฐาน • อัตราการเติบโตของฟังก์ชัน • สัญกรณ์เชิงเส้นกำกับ • การวิเคราะห์การทำงาน • แบบลำดับ, แบบเลือกทำ, แบบวงวน, แบบเรียกซ้ำ
ขั้นตอนการออกแบบอัลกอริทึมขั้นตอนการออกแบบอัลกอริทึม
จุดประสงค์ของการวิเคราะห์อัลกอริทึมจุดประสงค์ของการวิเคราะห์อัลกอริทึม • เพื่อศึกษาประสิทธิภาพของอัลกอริทึม • เวลาการทำงาน • ปริมาณหน่วยความจำที่ใช้ในการทำงาน
ประเภทการวิเคราะห์อัลกอริทึมประเภทการวิเคราะห์อัลกอริทึม • Mathematical Analysis • Experimental Analysis • แปลงเป็นโค้ด • สั่งทำงานกับข้อมูลทดสอบ • จับเวลาการทำงาน • บันทึกผล • วิเคราะห์ความสัมพันธ์ระหว่างเวลาการทำงานกับปริมาณข้อมูล มักเป็นรูปแบบฟังก์ชันทางคณิตศาสตร์
SelectionSort selectionSort(d[1..n]){ for (k = n; k > 1; k--) { maxI=1 for (i = 2; i <= k; i++) if (d[i] > d[maxI]) maxI = i d[k]d[maxI] } }
Selection Sort (ภาษา C) void selectionSort(int d[], int n) { intk, i; for (k = n - 1; k > 0; k--) { intmaxI=1; for (i = 0; i <= k; i++) if (d[i]> d[maxI]) maxI= i; intt = d[k]; d[k] = d[maxI]; d[maxI] = t; } }
#include <stdio.h> #include <stdlib.h> #include <windows.h> int main(intargc, char *argv[]) { inti, k, n, repeat = 10; for( n = 0; n<=20000; n+=2000) { int*d = malloc( n * sizeof(int) ); long sum = 0; for (k=0; k<repeat; k++) { for (i=0; i<n; i++) d[i] = i; long start = GetTickCount(); selectionSort(d, n); sum += GetTickCount() - start; } printf("%d \t %f \n", n, (float)sum/repeat); } system("PAUSE"); return 0; }
public class TestSelectionSort { public static void main(String[] args) { intrepeat = 10; for (int n = 0; n <= 20000; n += 2000) { int[]d = new int[n]; long sum = 0; for (int k = 0; k < repeat; k++) { for (inti = 0; i <n;i++) d[i] = i; { long start = System.currentTimeMillis(); selectionSort(d); sum += System currentTimeMillis() - start; } System.out.printf("%d \t %f \n", (double)sum/repeat); } }
public class TestSelectionSort { public static void main(String[] args) { intrepeat = 10; for (int n = 0; n <= 20000; n += 2000) { int[]d = new int[n]; long sum = 0; for (int k = 0; k < repeat; k++) { for (inti = 0; i <n;i++) d[i] = i; { long start = System.currentTimeMillis(); selectionSort(d); sum += System currentTimeMillis() - start; } System.out.printf("%d \t %f \n", (double)sum/repeat); } } for (inti = 0; i < 10000; i++) selectionSort(new int[1]);
สั่งทำงาน พร้อมบันทึกผล • ภาษา C : ใช้ GNU-C Compiler (3.4.2) • ภาษา Java : ใช้ Java 6 (build 1.6.0_14-b08) • Interpreted-only mode (option –Xintตอนทำงาน) • Compilation to native code (บังคับ compile ด้วยการเรียกเมท็อดว้ำ ๆ สัก 10 000 ครั้ง) • Intel Core 2 DuoP8400 2.26GhzRam 3GBWindows XP
เปรียบเทียบเวลาการทำงานเปรียบเทียบเวลาการทำงาน
ใช้จำนวนการทำงานของคำสั่งแทนเวลาใช้จำนวนการทำงานของคำสั่งแทนเวลา static intcounter= 0; static void selectionSort(int[] d) { counter = 1+d.length +d.length-1; for (int k = d.length-1; k > 0; k--) { intmaxI=1; counter += 2 + k+2 + k+1; for (inti = 0; i <= k; i++) { counter += 1; if (d[i] > d[maxI]) { maxI=i; counter+=1; } } counter += 3; intt = d[k]; d[k] = d[maxI]; d[maxI] = t; } }
เขียนโปรแกรมทดลองนับคำสั่งเขียนโปรแกรมทดลองนับคำสั่ง public class TestSelectionSort { public static void main(String[] args) { intrepeat = 10; for (int n = 0; n <= 20000; n += 2000) { int[]d = new int[n]; long sum = 0; for (int k = 0; k < repeat; k++) { for (inti = 0; i <n;i++) d[i] = i;; counter = 0; selectionSort(d); sum += counter; } System.out.printf("%d \t %f \n", n, (double)sum/repeat); } }
นับจำนวนการทำงานของคำสั่งนับจำนวนการทำงานของคำสั่ง
นับเฉพาะคำสั่งตัวแทน static intcounter= 0; static voidselectionSort(int[] d) { for (int k = d.length-1; k > 0; k--) { intmaxI=1; for (inti = 0; i <= k; i++) { counter += 1; if (d[i] > d[maxI]) { maxI= i; } } int t d[k]; d[k] = d[maxI]; d[maxI]=t; } }
นับทุกคำสั่ง VS. นับคำสั่งตัวแทน
Mathematical Analysis • ไม่ต้องเขียนเป็นโปรแกรม ไม่ต้องสั่งทำงานจริง ไม่ต้องวาดกราฟ วิเคราะห์จากอัลกอริทึม จะได้เป็นฟังก์ชั่น 1
นับทุกคำสั่ง VS. นับคำสั่งตัวแทน
คำสั่งตัวแทนต้องเป็นคำสั่งพื้นฐานคำสั่งตัวแทนต้องเป็นคำสั่งพื้นฐาน • คำสั่งพื้นฐาน คือคำสั่งที่ • ใช้เวลาการทำงานไม่เกินค่าคงที่ค่าหนึ่ง • ใช้เวลาการทำงานไม่แปรตามขนาดของ input • เช่น + - * / if เปรียบเทียบ return break …
การวิเคราะห์อัลกอริทึมการวิเคราะห์อัลกอริทึม • เวลาการทำงาน แปรตามจำนวนการทำงานของคำสั่ง • จำนวนการทำงานของคำสั่ง แปรตาม จำนวนการทำงานของคำสั่งตัวแทน • เพื่อความง่าย เราวิเคราะห์อัลกอริทึมเชิงเวลาด้วยการหาความสัมพันธ์ของ • จำนวนการทำงานของคำสั่งตัวแทน • ปริมาณข้อมูล
วัดปริมาณข้อมูลขาเข้าวัดปริมาณข้อมูลขาเข้า • พิจารณาว่า ขนาดของ input แปรตามค่าอะไรของ input • ตัวอย่าง: sort(d[1…n]) • Input เป็นอาเรย์จำนวน n ช่อง • แต่ละจำนวนมีค่าจำกัด • ดังนั้น n แทนปริมาณข้อมูล • ตัวอย่าง:shortestPath( V, E, w, s ) • Input เป็นกราฟถ่วงน้ำหนัก • ขนาดของกราฟ แปรตามจำนวนปมและจำนวนเส้นเชื่อม • ดั้งนั้น |V|+|E| แทนปริมาณของข้อมูล
เปรียบเทียบผลการวิเคราะห์เปรียบเทียบผลการวิเคราะห์
เปรียบเทียบเวลาการทำงานเปรียบเทียบเวลาการทำงาน
เปรียบเทียบอัตราการเติบโตเปรียบเทียบอัตราการเติบโต
อัตราการเติบโตของฟังก์ชันอัตราการเติบโตของฟังก์ชัน
f(n) vs. g(n) • ใครโตเร็วกว่ากัน ให้ดูที่พฤติกรรมตอนที่ค่า n เยอะๆ ว่าใครนำหน้าใคร คือ ค่าคงตัวที่ไม่ใช่ 0
ตัวอย่าง = = = สรุปได้ว่า
= = = = สรุปได้ว่าโตเท่ากับ
L'Hôpital's rule • ถ้า และ เป็นฟังก์ชันที่หาอนุพันธ์ได้ โดยที่ , • และหาค่าของ • จะได้ว่า
เรียงลำดับฟังก์ชันตามการเติบโตเรียงลำดับฟังก์ชันตามการเติบโต
สัญกรณ์เชิงเส้นกำกับ (Asymptotic Notations)