งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

Data Structures and Algorithms 2/2561

งานนำเสนอที่คล้ายกัน


งานนำเสนอเรื่อง: "Data Structures and Algorithms 2/2561"— ใบสำเนางานนำเสนอ:

1 88621159 Data Structures and Algorithms 2/2561
Algorithm Analysis Data Structures and Algorithms 2/2561

2 Complexity Analysis การวิเคราะห์ความซับซ้อนของอัลกอริทึม
กระบวนการที่นำไปสู่การตัดสินใจว่าอัลกอริทึมไหนมีประสิทธิภาพมากกว่า Algorithm A Algorithm B

3 อยากรู้เวลาการทำงาน เขียนโปรแกรม สั่งทำงาน จับเวลา
ตัวอย่าง อยากทราบ ผลต่าง ของคู่ข้อมูลใน Array ที่มีผลต่างมากที่สุด

4 Algorithm A หาผลต่างของทุกคู่ diff maxDiff Array Size=8 5 12 7 2 11 1
4 9 หาผลต่างของทุกคู่

5 Algorithm B หาผลต่าง max กับ min Max Min Array Size=8 5 12 7 2 11 1 4
9 หาผลต่าง max กับ min

6 เปรียบเทียบเวลาทำงาน
เวลาการทํางานขึ้นกับหลายปัจจัย เช่น ภาษา, เครื่อง , ผู้เขียน, ...

7 Types of measurement Big-O Notation Big O Notation คือ ระยะเวลาที่แย่ที่สุด หรือพื้นที่ในหน่วยประมวลผลที่มากที่สุด ที่คอมพิวเตอร์ต้องจ่ายให้กับการ run อัลกอริทึมใดๆ

8 Worst Case Array Size=10 Jane John Kate Mike Lee Big Arm Mine Zen Top
…. Big Arm Mine Zen Top Top

9 Type of Big O Notation Big O Notation จะเน้นที่เรื่องระยะเวลาในการประมวลผล และสนใจระยะเวลาที่แย่ที่สุด สัญลักษณ์ O(n) เมื่อ n คือ จำนวน input ที่เข้ามาในอัลกอริทึม

10 วัดอย่างไร เขียนอัลกอรทิม กําหนดตัวแปรที่แทนปริมาณข้อมูลเข้า
หาคําสั่งตัวแทน วิเคราะห์จํานวนครั้งที่คําสั่งตวแทนทำงาน

11 O(1) or Constant การประกาศตัวแปร คำสั่ง conditional เช่น if, switch
operator เช่น +, -, >, <, = ใช้เวลาคงที่ คือ 1 ครั้ง เรียกว่าเป็น constant

12 O(1) or Constant ไม่สนค่าคงที่ แต่จะนับแค่ statement ที่สำคัญ
boolean F1(int n){ int x; x = 5 + (15*20); if(x > n) System.out.println(x); else System.out.println(n); } ไม่สนค่าคงที่ แต่จะนับแค่ statement ที่สำคัญ ไม่ว่า n จะมีขนาด 1, 1000, 1M+ หรือเท่าไหร่ก็ตาม ระยะเวลาที่ใช้ในการประมวลผลก็ยังไม่เปลี่ยนแปลง คือ เท่ากับ 1 เสมอ

13 O(n) or Linear Loop 1 ชั้น ระยะเวลาขึ้นอยู่กับจำนวน n ที่ใส่เข้ามา
int F2(int n){ int sum=0; for(int i=0; i<n; i++) sum+=1; return sum; } Loop 1 ชั้น ระยะเวลาขึ้นอยู่กับจำนวน n ที่ใส่เข้ามา ซึ่งถ้าจำนวน n เพิ่มขึ้นสองเท่า ระยะเวลาที่ใช้ในการประมวลผลก็จะเพิ่มขึ้นสองเท่าด้วย

14 O(n2) or Quadratic 2-nested loop
int F3(int n){ int sum=0; for(int i=0; i<n; i++) for(int j=0; j<n; j++) sum+=i+j; return sum; } 2-nested loop หากเพิ่มขนาด n เข้ามาสองเท่า จะทำให้ระยะเวลาเพิ่มขึ้น 4 เท่า

15 O(n3) or Cubic 3-nested loop
int F4(int n){ int sum=0; for(int i=0; i<n; i++) for(int j=0; j<n; j++) for(int k=0; k<n; k++) sum+=i+j+k; return sum; } 3-nested loop หากเพิ่มขนาด 2 เข้ามาสองเท่า จะทำให้ระยะเวลาเพิ่มขึ้น 8 เท่า

16 O(log n) or Logarithmic
int F5(int n){ for(int i=1; i<=n; i=i*2) sum+=1; return sum; } อัลกอริทึมที่ในการวนลูปแต่ละรอบ จะตัดจำนวนข้อมูลที่ไม่มีโอกาสเกิดขึ้นออกไปทีละครึ่งนึง เช่น อัลกอริทึม binary search

17 O(log n) or Logarithmic
อัลกอริทึม binary search เป็นการ search หาข้อมูลใน Ordered Array (Array ที่ sort มาแล้ว) ไล่หาทีละช่วงไปเรื่อยๆ โดยเริ่มจากตรงกลาง 1 2 3 4 5 6 7 8 5

18 O(log n) or Logarithmic
อัลกอริทึม binary search เป็นการ search หาข้อมูลใน Ordered Array (Array ที่ sort มาแล้ว) ไล่หาทีละช่วงไปเรื่อยๆ โดยเริ่มจากตรงกลาง หาก Array มีขนาด 1000 การหาครั้งแรกก็จะตัดข้อมูลที่ไม่ใช่ออกไปครึ่งนึง Worst case คือ เจอตัวสุดท้าย 1 2 3 4 5 6 7 8 5

19 O(log n) or Logarithmic
การหา binary search ถ้าเริ่มด้วย n รอบต่อไปจะเหลือ n/2, n/4, n/8, … จนเหลือ 1 ตัวสุดท้าย คิดกลับ หากเริ่มที่ 1 รอบต่อไปเป็น 2, 4, 8, 16, .. นั่นคือ 2x ≈ n, x คือ จำนวนรอบ เปลี่ยนจาก exponential เป็น logarithm จะได้ x = log2n (โดยประมาณ) ดังนั้น Big O คือ O(log n)

20 O(n log n) or Linearithmic
int F6(int n){ for(int i=1; i<=n; i=i*2) for(int j=1; j<=n; j++) sum+=i+j; return sum; } เป็นการวนลูปสองรอบ โดยลูปนึงวนแบบปกติ (n รอบ) อีกลูปนึงวนแบบตัดข้อมูลที่ไม่เกี่ยวข้องออกไปทีละครึ่งด้วย (log n)

21 O(2n) or Exponential // Fibonacci int fib(int n) { if (n <= 1) return n; else return fib(n - 2) + fib(n - 1); } การเพิ่มขนาดของ n แค่นิดเดียว ก็ทำให้ระยะเวลาในการประมวลผลเพิ่มขึ้นแบบมหาศาล

22 O(n!) or Factorial loop with recursive
void nFacRuntimeFunc(int n) { for(int i=0; i<n; i++) { nFacRuntimeFunc(n-1); } loop with recursive Big O = O(n) * O(n-1) * O(n-2) * … * O(1) = O(n!)

23 Big O Complexity Chart

24 วิธีการคำนวณหา Big O ต้องการวัดอัลกอริทึมอย่างคร่าวๆ ซึ่งไม่จำเป็นต้องได้ตัวเลขที่ถูกต้อง 100%

25 Step การคำนวณหา Big O ไม่ต้องสนใจค่าคงที่ (constant) ตัดค่าคงที่ทิ้ง
ถ้ามี nested loop จะเอา Big O แต่ละ loop มาคูณกัน ถ้าเป็น loop ที่อยู่ระดับเดียวกัน (หรือเรียงต่อกัน ไม่ได้เป็น nested) ให้เอา Big O มาบวกกัน ถ้ารวมกันหมดแล้ว Big O มีหลาย term ให้เราสนใจเฉพาะ ตัวที่เลวร้ายมากที่สุด ถ้ามีการเรียกใช้ function ภายนอก ต้องคำนวณ Big O ของ function ภายนอกนั้นด้วย

26 Exercise 1 Total time = O(1) + O(1) + O(1) = O(3) = O(1)
int x; //O(1) x = 5 + (15*20); //O(1) System.out.println(x); //O(1) Total time = O(1) + O(1) + O(1) = O(3) = O(1)

27 Exercise 2 Total time = O(n) * O(1) = O(n)
for(int i=0; i<n; i++)//O(n) System.out.println(i);//O(1) Total time = O(n) * O(1) = O(n)

28 Exercise 3 Total time = O(1) + O(n) = O(n)
x = 5 + (15*20); //O(1) for(int i=0; i<n; i++) System.out.println(i); O(n) Total time = O(1) + O(n) = O(n)

29 Exercise 4 Total time = O(n) + O(n) = O(n)
for(int i=0; i<n; i++) System.out.println(x); O(n) O(n) Total time = O(n) + O(n) = O(n)

30 Exercise 5 Total time = O(2n) = O(n)
for(int i = 0; i < 2*n; i++) { System.out.println(i); } Total time = O(2n) = O(n)

31 Exercise 6 Total time = O(1) + O(n) + O(n2) = O(n2)
x = 5 + (15*20); //O(1) for(int i=0; i<n; i++) System.out.println(x); for(int j=0; j<n; j++) O(n) O(n2) Total time = O(1) + O(n) + O(n2) = O(n2)

32 Exercise 7 Total time = O(n2)
if(x>0) x = 5 + (15*20); else if(x<0) for(int i=0; i<n; i++) System.out.println(x); else for(int j=0; j<n; j++) O(n) O(n2) Total time = O(n2)

33 Exercise 8 Total time = O(n) * O(n) = O(n2)
function(int n) { int sum = 0; for(int i=0; i<n; i++) { // O(n) if(i > j) { sum = sum + 1; } else { for(int k=0; k<n; k++) // O(n) sum = sum – 1; } Total time = O(n) * O(n) = O(n2)

34 Exercise 9 Total time = O(1) * O(n) = O(n)
for(int i = 0; i < n; i++) { // O(n) for(int j = 0; j < 2; j++) { // O(1) // do stuff } Total time = O(1) * O(n) = O(n)

35 Exercise 10 Total time = O(n) * O(n) = O(n2)
for(int i = 0; i < n*n; i++) { // O(n) * O(n) System.out.println(i); } Total time = O(n) * O(n) = O(n2)

36 Exercise 11 Total time = O(n/2) * O(5) * O(n) = O(n2)
int function(int n){ int i, j, k, sum=0; for(i=0; i < (n/2); i++) for(j=0; j<5; j++) for(k=0; k<n; k++) sum+=n; return sum; } Total time = O(n/2) * O(5) * O(n) = O(n2)

37 Reference


ดาวน์โหลด ppt Data Structures and Algorithms 2/2561

งานนำเสนอที่คล้ายกัน


Ads by Google