# Dynamic Programming (continued) - PowerPoint PPT Presentation Download Presentation Dynamic Programming (continued)

Dynamic Programming (continued) Download Presentation ## Dynamic Programming (continued)

- - - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - - -
##### Presentation Transcript

1. Dynamic Programming (continued) Programming Puzzles and Competitions CIS 4900 / 5920 Spring 2009

2. TCO 09 Algorithms (March)

3. Lecture Outline • Order Notation (for real this time) • Dynamic Programming w/ Iteration • Fibonacci numbers (revisited) • Text Segmentation (revisited) • ACM ICPC

4. Algorithmic Complexity • We would like to be able to describe how long a program takes to run

5. Algorithmic Complexity • We would like to be able to describe how long a program takes to run • We should express the runtime in terms of the input size

6. Algorithmic Complexity • Absolute time measurements are not helpful, as computers get faster all the time

7. Algorithmic Complexity • Absolute time measurements are not helpful, as computers get faster all the time • Also, runtime is clearly dependent on the input (and input size)

8. Order Notation • We define O(*) as follows

9. Order Notation • Basically, we just want to count the number of operations (without being too precise)

10. Examples • What’s the complexity of the following code? int c = a + b;

11. Examples • What’s the complexity of the following code? int c = a + b; • Answer: O(1)

12. Examples • What’s the complexity of the following code? int c = a + b; • Answer: O(1) • (it actually depends on how you count)

13. Example 2 for(int i = 0; i < n; ++i) { //do something }

14. Example 2 for(int i = 0; i < n; ++i) { //do something } • Answer: O(n)

15. Example 2 for(int i = 0; i < n; ++i) { //do something } • Answer: O(n) • O(c) operations for each i  O(cn) == O(n) total operations

16. Example 2 for(int i = 0; i < n; ++i) { for(int j = 0; j < n; ++j) { //do something } }

17. Example 2 for(int i = 0; i < n; ++i) { for(int j = 0; j < n; ++j) { //do something } } • Answer: O(n2)

18. Example 2 for(int i = 0; i < n; ++i) { for(int j = 0; j < n; ++j) { //do something } } • Answer: O(n2) • O(n) operations for each i == n * n total operations == O(n2) total operations

19. Example 3 for(int i = 0; i < n; ++i) { for(int j = i; j < n; ++j) { //do something } }

20. Example 3 for(int i = 0; i < n; ++i) { for(int j = i; j < n; ++j) { //do something } } • The first iteration of the outer loop takes O(n)

21. Example 3 for(int i = 0; i < n; ++i) { for(int j = i; j < n; ++j) { //do something } } • The second iteration of the outer loop takes O(n-1)

22. Example 3 for(int i = 0; i < n; ++i) { for(int j = i; j < n; ++j) { //do something } } • The third iteration of the outer loop takes O(n-2)…

23. Example 3 for(int i = 0; i < n; ++i) { for(int j = i; j < n; ++j) { //do something } } • The last iteration of the outer loop takes O(1)

24. Example 3 • n + (n–1) + … + 1 = ?

25. Example 3 • n + (n–1) + … + 1 = ? • Call this sum N

26. Example 3 • n + (n–1) + … + 1 = N • Call this sum N

27. Example 3 • n + (n–1) + … + 1 = N • Call this sum N N = n + (n-1) + … + 2 + 1

28. Example 3 • n + (n–1) + … + 1 = N • Call this sum N N = n + (n-1) + … + 2 + 1 N = 1 + 2 + … + (n-1) + n

29. Example 3 • n + (n–1) + … + 1 = N • Call this sum N N = n + (n-1) + … + 2 + 1 N = 1 + 2 + … + (n-1) + n • Now, add these two together: 2N = (n + 1) + ((n-1) + 2) + … + (1 + n)

30. Example 3 • n + (n–1) + … + 1 = N • Call this sum N N = n + (n-1) + … + 2 + 1 N = 1 + 2 + … + (n-1) + n • Now, add these two together: 2N = (n + 1) + ((n-1) + 2) + … + (1 + n) = n * (n + 1)

31. Example 3 • n + (n–1) + … + 1 = N • Call this sum N N = n + (n-1) + … + 2 + 1 N = 1 + 2 + … + (n-1) + n • Now, add these two together: 2N = (n + 1) + ((n-1) + 2) + … + (1 + n) = n * (n + 1) N = n * (n + 1) / 2

32. Example 3 • n + (n–1) + … + 1 = N • Call this sum N N = n + (n-1) + … + 2 + 1 N = 1 + 2 + … + (n-1) + n • Now, add these two together: 2N = (n + 1) + ((n-1) + 2) + … + (1 + n) = n * (n + 1) N = n * (n + 1) / 2 = O(n2)

33. Examples • This is also the number of ways 2 items can be chosen from a set of (n + 1) items, disregarding order and without replacement (also called “(n + 1) choose 2”, binomial coefficient)

34. Fibonacci Numbers • F0 = 0 • F1 = 1 • Fn = Fn-1 + Fn-2 for n > 1 • 0, 1, 1, 2, 3, 5, 8, 13, …

35. Fibonacci Numbers int fibonacci(int n) { if(n == 0 || n == 1) return n; else return fibonacci(n-1) + fibonacci(n-2); }

36. Fibonacci Numbers: Computing F(5)

37. Fibonacci Numbers: Computing F(5) F(5) = active

38. Fibonacci Numbers: Computing F(5) F(5) F(4)

39. Fibonacci Numbers: Computing F(5) F(5) F(4) F(3)

40. Fibonacci Numbers: Computing F(5) F(5) F(4) F(3) F(2)

41. Fibonacci Numbers: Computing F(5) F(5) F(4) F(3) F(2) F(1)

42. Fibonacci Numbers: Computing F(5) F(5) F(4) F(3) F(2) F(1)

43. Fibonacci Numbers: Computing F(5) F(5) F(4) F(3) F(2) F(1) F(0)

44. Fibonacci Numbers: Computing F(5) F(5) F(4) F(3) F(2) F(1) F(0)

45. Fibonacci Numbers: Computing F(5) F(5) F(4) F(3) F(2) F(1) F(0)

46. Fibonacci Numbers: Computing F(5) F(5) F(4) F(3) F(2) F(1) F(1) F(0)

47. Fibonacci Numbers: Computing F(5) F(5) F(4) F(3) F(2) F(1) F(1) F(0)

48. Fibonacci Numbers: Computing F(5) F(5) F(4) F(3) F(2) F(1) F(1) F(0)

49. Fibonacci Numbers: Computing F(5) F(5) F(4) F(3) F(2) F(2) F(1) F(1) F(0)