220 likes | 411 Views
Big-oh. T(N) = O(f(N)) ถ้ามีค่าคงที่บวก c และ n 0 ที่ทำให้ T(N) ≤ c f(N) เมื่อ N ≥ n 0. หมายความว่า เมื่อค่า N มากขึ้น จนกระทั่งมากกว่าค่าคงที่ n0 จะได้ T(N) มีค่าน้อยกว่า cf(N) สมการของ Big-oh, T(N) = O(f(N)) จะมองว่า
E N D
Big-oh T(N) = O(f(N)) ถ้ามีค่าคงที่บวก c และ n0 ที่ทำให้ T(N) ≤ c f(N) เมื่อ N ≥ n0 • หมายความว่า เมื่อค่า N มากขึ้น จนกระทั่งมากกว่าค่าคงที่ n0 จะได้ T(N) มีค่าน้อยกว่า cf(N) • สมการของ Big-oh, T(N) = O(f(N)) จะมองว่า อัตราการเติบโต (Growth Rate) ของฟังก์ชั่น T(N) น้อยกว่าหรือเท่ากับf(N) Week 04b - Algorithm Analysis (Con't)
Big-Oh ตัวอย่าง ให้ T(N) = 250Nและ f(N) = N2 พิจารณา N < 250 : 250N > N2 N = 250 : 250N = N2 N > 250 : 250N < N2 จะเห็นได้ว่าถ้าให้ c=1 และ n0 = 250 จะได้ (250N) ≤ 1* (N2) เมื่อ N ≥ 250 T(N) ≤ 1* f(N) เมื่อ N ≥ 250 หรือเรียกได้ว่า 250N = O(N2) นั่นคือ อัตราการเติบโตของ 250N น้อยกว่าหรือเท่ากับ N2 Week 04b - Algorithm Analysis (Con't)
Omega (Ω) T(N) = Ω(g(N)) ถ้ามีค่าคงที่บวก c และ n0 ที่ทำให้ T(N) ≥ c g(N) เมื่อ N ≥ n0 • หมายความว่า เมื่อค่า N มากขึ้น จนกระทั่งมากกว่าค่าคงที่ n0 จะได้ T(N) มีค่ามากกว่า cg(N) • สมการของ Omega, T(N) = Ω(g(N)) จะมองว่า อัตราการเติบโต (Growth Rate) ของฟังก์ชั่น T(N) มากกว่าหรือเท่ากับg(N) Week 04b - Algorithm Analysis (Con't)
Theta (Θ) T(N) = Θ(h(N)) เมื่อ T(N) = O(h(N)) และ T(N) = Ω(h(N)) ด้วย เท่านั้น • หมายความว่า เมื่อค่า N มากขึ้น จนกระทั่งมากกว่าค่าคงที่ n0 จะได้ T(N) มีค่าเท่ากับ cg(N) • สมการของ Omega, T(N) = Θ(h(N)) จะมองว่า อัตราการเติบโต (Growth Rate) ของฟังก์ชั่น T(N) มากกว่าหรือเท่ากับh(N)พอดี Week 04b - Algorithm Analysis (Con't)
Little-oh (o) T(N) = o(p(N)) ถ้า T(N) = O(p(N)) และ T(N) ≠Θ(p(N)) • หมายความว่า เมื่อค่า N มากขึ้น จนกระทั่งมากกว่าค่าคงที่ n0 จะได้ T(N) มีค่ามากกว่าแต่ไม่เท่ากับ cp(N) • สมการของ Little-oh, T(N) = o(p(N)) จะมองว่า อัตราการเติบโต (Growth Rate) ของฟังก์ชั่น T(N) มากกว่าp(N)เท่านั้น Week 04b - Algorithm Analysis (Con't)
ตัวอย่าง พิจารณาฟังก์ชั่น f(N) = 8N 2 • 8N2 โตเร็วกว่า 15N 8N2 = Ω(15N) 15N= O(8N2) • 8N2โตเท่ากับ 26N2 8N2 = O(26N2) 8N2 = Ω(26N2) 8N2 = Θ(26N2) *** • 8N2โตช้ากว่า 2N3 8N2 =O(2N3) Week 04b - Algorithm Analysis (Con't)
กฎในการคำนวณอัตราการเติบโตกฎในการคำนวณอัตราการเติบโต • ถ้า T1(N) = O(f(N)) และ T2(N) = O(g(N)) แล้ว จะได้ (a.)T1(N) + T2(N) = max(O(fN), O(g(N))) (b.)T1(N) * T2(N) = O(f(N) * g(N)) • ถ้า T(N) เป็นสมการพหุนามกำลัง k(Polynomial degree k) แล้ว จะได้ T(N) = Θ(Nk) นั่นคือ อัตราการเติบโตของฟังก์ชั่นพหุนามกำลัง k เป็น Nk • logkN = O(N) สำหรับค่า k ใดๆ นั่นคือ logkN โตช้ากว่าNดังนั้นจะได้ว่าอัลกอริทึมนั้นๆมีอัตราการเติบโตต่ำมากๆ Week 04b - Algorithm Analysis (Con't)
อัตราการเติบโต Week 04b - Algorithm Analysis (Con't)
หลักการวิเคราะห์อัลกอริทึม • สำหรับการเลือกอัลกอริทึม สิ่งที่เราต้องวิเคราะห์ได้แก่ทรัพยากรที่ใช้ในการทำงานบนอัลกอริทึมนั้นๆ โดยทรัพยากรที่สำคัญที่สุดได้แก่เวลาที่ใช้ในการทำงาน (Running Time) • ปัจจัยที่มีผลต่อ Running Time ได้แก่ คอมไพล์เลอร์ (Compiler), เครื่องคอมพิวเตอร์, Algorithm ที่ใช้ และ Input สำหรับการทำงานบน algorithm นั้นๆ • ขนาดของ Input (N) ถือเป็นสิ่งที่เรานำมาพิจารณามากที่สุด Week 04b - Algorithm Analysis (Con't)
Running Time • Tavg(N) = เวลาในการทำงานโดยเฉลี่ย (Average Running Time) • Tworst(N) = เวลาในการทำงานในกรณีเลวร้ายที่สุด (Worst-case Running Time) โดยทั่วไป จำนวนของ input ที่ต้องการจะระบุให้กับกรณี worst-case นั่นคือ เราจะระบุขอบเขตของ input ทั้งหมดโดยเฉพาะอย่างยิ่ง input ที่ไม่ดี Week 04b - Algorithm Analysis (Con't)
ตัวอย่าง • เมื่อให้หาค่าผลรวมที่มากที่สุดของชุดตัวเลขที่ติดกัน ∑k=i j Ai จะได้ Running Time สำหรับแต่ละขนาดของ input ดังตาราง Week 04b - Algorithm Analysis (Con't)
เปรียบเทียบระหว่าง Algorithm ที่ใช้ทั้ง 4 Algorithms จะได้ Running Time ดังกราฟ Week 04b - Algorithm Analysis (Con't)
ค่าจำนวน Input (N) เทียบกับ Running Time (s.) สำหรับ Algorithm ต่างๆ Week 04b - Algorithm Analysis (Con't)
หลักในการวิเคราะห์อัลกอริทึมหลักในการวิเคราะห์อัลกอริทึม เพื่อให้การวิเคราะห์ง่ายขึ้น เราได้ยึดหลักว่า • ไม่มีการระบุหน่วยของเวลาในการวิเคราะห์ • ไม่พิจารณาค่าคงที่ (Constant) ที่นำหน้าฟังก์ชั่น • ไม่พิจารณาเทอมที่มี Order ต่ำกว่า เช่น 3N3 + 6N + 10 เราจะพิจารณาเฉพาะเทอมสูงสุด นั่นคือ 3N3 ซึ่งคิดเป็น O(N3) • ใช้หลัก Big-oh ในการพิจารณาเท่านั้น Week 04b - Algorithm Analysis (Con't)
N ∑ i3 i=1 กำหนดค่าตัวแปร = 1 time unit กำหนดค่าเริ่มต้น 1 (i=1) เป็น 1 unit ตรวจสอบค่า (i<=N) ทั้งหมด N+1 รอบ เพิ่มค่า (i++) ทั้งหมด N รอบ ดังนั้น ได้ 1+N+1+N = 2N+2 unit ดำเนินการ รวม 4 time unit *, *, +, = ทำงานทั้งหมด N รอบ ดังนั้นเป็น 4N Return ค่า 1 unit int mySum (int N) { int i, Sum; Sum = 0; for(i=1; i <=N; i++) Sum += i * i * i; return Sum; } • ตัวอย่าง คำนวณค่า 1+4N+1+(2N+2) = 6N+4 units = O(N) Week 04b - Algorithm Analysis (Con't)
กฏการวิเคราะห์ • Rule 1: For Loops Running Time ของ For Loop จะมีค่าสูงสุดเท่ากับค่าการทำงานของคำสั่งภายใน Loop (รวมถึงการ test ด้วย) คูณด้วยจำนวนการวน Loop • Rule 2: Nested For Loops การคำนวณ Running Time ของ For Loop หลายอันซ้อนกัน ให้คำนวณจากในไปนอก จะได้ Running Time เท่ากับค่าการทำงานของคำสั่งภายใน Loop คูณด้วยผลคูณของขนาดของการวน Loop ของ Loop ทั้งหมด Week 04b - Algorithm Analysis (Con't)
Rule 1 - Loop for (int i=0; i<N; i++) temp = temp * i * i; • Loop i วนทั้งหมด N รอบ • แต่ละรอบทำงาน 3 operations ได้แก่ การคูณ 2 รอบ แล้วการ assign ค่าด้วยเครื่องหมาย (=) • ดังนั้นภายในloop ทำงานคิดเป็น 3N • ตัว loop เองประกอบด้วย • การกำหนดค่าเริ่มต้น i=0 คิดเป็น 1 time unit • การ test i<N ทั้งหมด N+1รอบ • เพิ่มค่า i++ ทั้งหมด Nรอบ • ได้ running time เป็น 3N +(1+(N +1)+N) = 5N + 2= O(N) Week 04b - Algorithm Analysis (Con't)
Rule 2 - Nested For Loops for (int i=0; i<N; i++) for (int j=0; j<N; j++) k += 2; • Loop นอก (loop i) วนทั้งหมด N รอบ • Loop ใน (loop j) วนทั้งหมด N รอบ • ได้ running time เป็น O(N 2) *** Week 04b - Algorithm Analysis (Con't)
กฏการวิเคราะห์ • Rule 3:Consecutive Statements สำหรับคำสั่งที่ต่อกัน ให้บวก Running Time เข้าด้วยกัน แล้วนำค่าที่ให้ Running Time สูงสุดมาพิจารณา • Rule 4: If-Else Statement ค่า Running Time ของ If-Else จะไม่มากไปกว่า Running Time ของการ Test เงื่อนไข บวกด้วยค่า Running Time ของแต่ละกรณีที่จะเกิดขึ้น Week 04b - Algorithm Analysis (Con't)
O(N) O(N2) Rule 3 - Consecutive Statements for (int i=0; i<N; i++) a[i] = a[i] + 10; for (int j=0; j<N; j++) for (int k=0; k<N; k++) a[k] += 2; • Statement ชุดแรกให้ running time เป็น O(N) • Statement ชุดที่สองให้ running time เป็น O(N2) • นำค่าที่ให้ Running Time สูงสุดมาพิจารณา • ได้ running time เป็น O(N 2) *** Week 04b - Algorithm Analysis (Con't)
Rule 4 – If-Else Statement if (condition) { statement 1 } else { statement 2 } ค่า Running Time ของ If-Else จะไม่มากไปกว่า Running Time ของการ Test conditionบวกด้วยค่า Running Time ของ statement 1 หรือ statement 2 Week 04b - Algorithm Analysis (Con't)
Example1: Factorial with recursion int factorial (int n) { if( n == 0 ) return 1; else return ( n * factorial(n - 1)); } • การ test condition if(n==0)ให้ running time เป็น 1 • การ return 1ให้ running time เป็น 1 • ในส่วนของการ recursion ต้องเรียกฟังก์ชั่น factorial นี้ทั้งหมด n ครั้ง (ครั้งนี้ และอีก n-1 ครั้ง เพื่อคำนวณค่า factorial (n-1)) • ได้ running time ทั้งหมดเป็น O(N) Week 04b - Algorithm Analysis (Con't)