Presentation is loading. Please wait.

Presentation is loading. Please wait.

TCSS 342 Lecture Notes Course Overview, Review of Math Concepts,

Similar presentations


Presentation on theme: "TCSS 342 Lecture Notes Course Overview, Review of Math Concepts,"— Presentation transcript:

1 TCSS 342 Lecture Notes Course Overview, Review of Math Concepts,
Algorithm Analysis and Big-Oh Notation Weiss book, Chapter 5 These lecture notes are copyright (C) Marty Stepp, They may not be rehosted, sold, or modified without expressed permission from the author. All rights reserved.

2 Lecture outline Introduction and course objectives
Mathematical background review exponents and logarithms arithmetic and geometric series Algorithm analysis and Big-Oh notation the RAM model Big-Oh Big-Omega, Big-Theta, Little-Oh, Little-Omega Comparison of algorithms to solve the Maximum Contiguous Subsequence Sum problem

3 Course objectives (broad) prepare you to be a good software engineer
(specific) learn basic data structures and algorithms data structures – how data is organized algorithms – unambiguous sequence of steps to compute something algorithm analysis – determining how long an algorithm will take to solve a problem Who cares? Aren't computers fast enough and getting faster? "Data Structures + Algorithms = Programs" -- Niklaus Wirth, author of Pascal language Motivational speech. knowing data structures and algorithms is part of being able to contribute to software devlopment, getting a good job.

4 An example Given an array of 1,000,000 integers, find the maximum integer in the array. Now suppose we are asked to find the kth largest element. (The Selection Problem) 1 2 999,999

5 Candidate solutions candidate solution 1 candidate solution 2
sort the entire array (from small to large), using Java's Arrays.sort() pick out the (1,000,000 – k)th element candidate solution 2 place the first k elements into a sorted array of size k for each of the remaining 1,000,000 – k elements, keep the k largest in the array pick out the smallest of the k survivors and toss it

6 Is either solution good?
What advantages and disadvantages does each solution have? Is there a better solution? What makes a solution "better" than another? Is it entirely based on runtime? How would you go about determining which solution is better? could code them, test them could somehow make predictions and analysis of each solution, without coding

7 Why algorithm analysis?
as computers get faster and problem sizes get bigger, analysis will become more important The difference between good and bad algorithms will get bigger being able to analyze algorithms will help us identify good ones without having to program them and test them first

8 Why data structures? when programming, you are an engineer
engineers have a bag of tools and tricks – and the knowledge of which tool is the right one for a given problem Examples: arrays, lists, stacks, queues, trees, hash tables, heaps, graphs

9 Mathematical background review
Let's review some math material that'll be useful later when computing the runtime of various algorithms.

10 Math background: exponents
XY , or "X to the Yth power"; X multiplied by itself Y times Some useful identities XA XB = XA+B XA / XB = XA-B (XA)B = XAB XN+XN = 2XN 2N+2N = 2N+1 exponents grow really fast: use doubling salary example, $1000 initial, yearly $1000 increase, vs $1 initial, doubles every year. Which is better after 20 years? logs grow really slow. logs are inverses of exponents.

11 Math background:Logarithms
definition: XA = B if and only if logX B = A intuition: logX B means: "the power X must be raised to, to get B" In this course, a logarithm with no base implies base 2. log B means log2 B Examples log2 16 = 4 (because 24 = 16) log = 3 (because 103 = 1000)

12 Logarithm identities Identities for logs with addition, multiplication, powers: log (AB) = log A + log B log (A/B) = log A – log B log (AB) = B log A Identity for converting bases of a logarithm: example: log432 = (log2 32) / (log2 4) = 5 / 2 Proof: Let X = log A, Y = log B, and Z = log AB. Then 2X = A, 2Y = B, and 2Z = AB. So, 2X 2Y = AB = 2Z. Therefore, X + Y = Z.

13 Logarithm problem solving
When presented with an expression of the form: logaX = Y and trying to solve for X, raise both sides to the a power. X = aY logaX = logbY and trying to solve for X, find a common base between the logarithms using the identity on the last slide. logaX = logaY / logab

14 Logarithm practice problems
Determine the value of x in the following equation. log7 x + log713 = 3 log8 4 - log8 x = log8 5 + log16 6

15 Math review: Arithmetic series
for some expression Expr (possibly containing i ), means the sum of all values of Expr with each value of i between j and k inclusive Example: = (2(0) + 1) + (2(1) + 1) + (2(2) + 1) + (2(3) + 1) + (2(4) + 1) = = 25

16 Series identities sum from 1 through N inclusive
is there an intuition for this identity? sum of all numbers from 1 to N (N-2) + (N-1) + N how many terms are in this sum? Can we rearrange them? Intuition for the "sum from 1 through N" identity: If you have n-2 + n-1 + n you can pair up numbers from each end. (1 + n) + (2 + n-1) + (3 + n-2) The sum of each pair is n+1, and there are n/2 pairs (because we had n elements to start with, and we're pairing them), so the sum of all pairs is (n+1) * n/2. This is the identity!

17 More series identities
sum from a through N inclusive (when the series doesn't start at 1) is there an intuition for this identity? The sum of all numbers from 4 to 10 is just the sum of all numbers from 1 to 10, minus the sum of 1 through 3. Intuition for the "sum from 1 through N" identity: If you have n-2 + n-1 + n you can pair up numbers from each end. (1 + n) + (2 + n-1) + (3 + n-2) The sum of each pair is n+1, and there are n/2 pairs (because we had n elements to start with, and we're pairing them), so the sum of all pairs is (n+1) * n/2. This is the identity!

18 Series of constants sum of constants (when the body of the series doesn't contain the counter variable such as i) example: Intuition for the "sum from 1 through N" identity: If you have n-2 + n-1 + n you can pair up numbers from each end. (1 + n) + (2 + n-1) + (3 + n-2) The sum of each pair is n+1, and there are n/2 pairs (because we had n elements to start with, and we're pairing them), so the sum of all pairs is (n+1) * n/2. This is the identity!

19 Splitting series for any constant k, splitting a sum with addition
moving out a constant multiple Intuition for the "sum from 1 through N" identity: If you have n-2 + n-1 + n you can pair up numbers from each end. (1 + n) + (2 + n-1) + (3 + n-2) The sum of each pair is n+1, and there are n/2 pairs (because we had n elements to start with, and we're pairing them), so the sum of all pairs is (n+1) * n/2. This is the identity!

20 Series of powers sum of powers of 2
= = 63 think about binary representation of numbers... (63) (1) (64) when the series doesn't start at 0:

21 Series practice problems
Give a closed form expression for the following summation. A closed form expression is one without the S or "…".

22 Algorithm analysis and Big-oh notation

23 Algorithm performance
How to determine how much time an algorithm A uses to solve problem X ? Depends on input; use input size "N" as parameter Determine function f(N) representing cost empirical analysis: code it and use timer running on many inputs algorithm analysis: Analyze steps of algorithm, estimating amount of work each step takes Coding often impractical at early design stages. Algorithm Analysis: determining how long an algorithm will take to solve a problem USING A MODEL.

24 RAM model Typically use a simple model for basic operation costs
RAM (Random Access Machine) model RAM model has all the basic operations: +, -, *, / , =, comparisons fixed sized integers (e.g., 32-bit) infinite memory All basic operations take exactly one time unit (one CPU instruction) to execute analysis= determining run-time efficiency. model = estimate, not meant to represent everything in real-world

25 Critique of the model Strengths: Weaknesses: simple
easier to prove things about the model than the real machine can estimate algorithm behavior on any hardware/software Weaknesses: not all operations take the same amount of time in a real machine does not account for page faults, disk accesses, limited memory, floating point math, etc model = approximation of real world. can predict run-time of algorithm on machine.

26 Relative rates of growth
most algorithms' runtime can be expressed as a function of the input size N rate of growth: measure of how quickly the graph of a function rises goal: distinguish between fast- and slow-growing functions we only care about very large input sizes (for small sizes, most any algorithm is fast enough) this helps us discover which algorithms will run more quickly or slowly, for large input sizes Motivation: we usually care only about algorithm performance when there are large number of inputs. We usually don’t care about small changes in run-time performance. (inaccuracy of estimates make small changes less relevant). Consider algorithms with slow growth rate better than those with fast growth rates.

27 Growth rate example Consider these graphs of functions.
Perhaps each one represents an algorithm: n3 + 2n2 100n Which grows faster?

28 Growth rate example How about now?

29 Review: Big-Oh notation
Defn: T(N) = O(f(N)) if there exist positive constants c , n0 such that: T(N)  c · f(N) for all N  n0 idea: We are concerned with how the function grows when N is large. We are not picky about constant factors: coarse distinctions among functions Lingo: "T(N) grows no faster than f(N)." Important (not in Lewis & Chase book). Write on board. (for next slide).

30 Big-Oh example problems
n = O(2n) ? 2n = O(n) ? n = O(n2) ? n2 = O(n) ? n = O(1) ? 100 = O(n) ? 10 log n = O(n) ? 214n + 34 = O(2n2 + 8n) ?

31 Preferred big-Oh usage
pick tightest bound. If f(N) = 5N, then: f(N) = O(N5) f(N) = O(N3) f(N) = O(N log N) f(N) = O(N)  preferred ignore constant factors and low order terms T(N) = O(N), not T(N) = O(5N) T(N) = O(N3), not T(N) = O(N3 + N2 + N log N) Wrong: f(N)  O(g(N)) Wrong: f(N)  O(g(N)) remove non-base-2 logarithms f(N) = O(N log6 N) f(N) = O(N log N)  preferred

32 Big-Oh of selected functions

33 Ten-fold processor speedup
"Who cares about choosing the fastest algorithm. If it is too slow, we'll just upgrade the computer..." Example data when computer is sped up by a factor of 10: Book has errata, including on this figure. 2^n = exponential complexity.

34 Big omega, theta Defn: T(N) = (g(N)) if there are positive constants c and n0 such that T(N)  c g(N) for all N  n0 Lingo: "T(N) grows no slower than g(N)." Defn: T(N) = (g(N)) if and only if T(N) = O(g(N)) and T(N) = (g(N)). Big-Oh, Omega, and Theta establish a relative ordering among all functions of N Defn: T(N) = o(g(N)) if and only if T(N) = O(h(N)) and T(N)  (h(N)).

35 Intuition about the notations
O (Big-Oh)  (Big-Omega)  (Theta) = o (little-Oh) <

36 More about asymptotics
Fact: If f(N) = O(g(N)), then g(N) = (f(N)). Proof: Suppose f(N) = O(g(N)). Then there exist constants c and n0 such that f(N)  c g(N) for all N  n0 Then g(N)  (1/c) f(N) for all N  n0, and so g(N) = (f(N))

37 More terminology T(N) = O(f(N)) T(N) = (g(N)) T(N) = o(h(N))
f(N) is an upper bound on T(N) T(N) grows no faster than f(N) T(N) = (g(N)) g(N) is a lower bound on T(N) T(N) grows at least as fast as g(N) T(N) = o(h(N)) T(N) grows strictly slower than h(N)

38 Facts about big-Oh If T1(N) = O(f(N)) and T2(N) = O(g(N)), then
T1(N) + T2(N) = O(f(N) + g(N)) T1(N) * T2(N) = O(f(N) * g(N)) If T(N) is a polynomial of degree k, then: T(N) = (Nk) example: 17n3 + 2n2 + 4n + 1 = (n3) logk N = O(N), for any constant k

39 Hierarchy of Big-Oh Functions, ranked in increasing order of growth: 1
log log n log n n n log n n2 n2 log n n3 ... 2n n! nn

40 Techniques Algebra ex. f(N) = N / log N g(N) = log N
same as asking which grows faster, N or log2 N Evaluate: limit is Big-Oh relation f(N) = o(g(N)) c  0 f(N) = (g(N)) g(N) = o(f(N)) no limit no relation

41 Techniques, cont'd L'Hôpital's rule: example: f(N) = N, g(N) = log N
If and , then example: f(N) = N, g(N) = log N Use L'Hôpital's rule f'(N) = 1, g'(N) = 1/N  g(N) = o(f(N))

42 Program loop runtimes for (int i = 0; i < n; i += c) // O(n) statement(s); Adding to the loop counter means that the loop runtime grows linearly when compared to its maximum value n. Loop executes its body exactly n / c times. for (int i = 0; i < n; i *= c) // O(log n) Multiplying the loop counter means that the maximum value n must grow exponentially to linearly increase the loop runtime; therefore, it is logarithmic. Loop executes its body exactly logc n times. for (int i = 0; i < n * n; i += c) // O(n2) The loop maximum is n2, so the runtime is quadratic. Loop executes its body exactly (n2 / c) times.

43 More loop runtimes Nesting loops multiplies their runtimes.
for (int i = 0; i < n; i += c) { // O(n2) for (int j = 0; j < n; i += c) { statement; } } Loops in sequence add together their runtimes, which means the loop set with the larger runtime dominates. for (int i = 0; i < n; i += c) { // O(n) } for (int i = 0; i < n; i += c) { // O(n log n) for (int j = 0; j < n; i *= c) {

44 Loop runtime problems Compute the exact value of the variable sum after the following code fragment, as a closed-form expression in terms of input size n. int sum = 0; for (int i = 1; i <= n; i *= 2) { sum++; } for (int i = 1; i <= 1000; i++) {

45 Loop runtime problems Compute the exact value of the variable sum after the following code fragment, as a closed-form expression in terms of input size n. int sum = 0; for (int i = 1; i <= n; i++) { for (int j = 1; j <= i / 2; j += 2) { sum++; }

46 "Maximum subsequence sum" problem

47 Maximum subsequence sum
The maximum subsequence sum problem: Given a sequence of integers A0, A1, ..., An - 1, find the maximum value of for any integers 0  (i, j) < n. (This sum is zero if all numbers in the sequence are negative.) For example, the maximum subseq. sum of this list is 33: [2, 9, -4, 1, -20, 3, 15, -10, 20, 5, -100, 10, 7]

48 Thoughts about the problem
This is a maximization problem. There are a set of possible answers (sums of subsets of the original array), and we are being asked to find the largest one. When solving maximization problems, one possible technique is to generate all possible solutions, compare them, and choose the appropriate one. In the context of this problem, that would mean generating all possible subsets of the original array, adding them up to determine each of their sums, and comparing these sums to choose the best one of them all. brute force algorithm: A method for solving a problem that proceeds in a simple and obvious way, possibly making it require more steps than necessary.

49 First algorithm (brute force)
generate and test all possible subsequences // implement together function maxSubsequence(array[]): max sum = 0 for each starting index i, for each ending index j, add up the sum from Ai to Aj if this sum is bigger than max, max sum = this sum return max sum Using the RAM model, how many steps does this algorithm require? What do you believe is the runtime (Big-Oh) of this algorithm? How could we empirically test this? What is wasteful about the algorithm? How could it be improved?

50 More observations The preceding algorithm is a brute force algorithm, but it isn't even the best brute force algorithm. We are redundantly re-computing a large number of values many times. For example, we compute the sum of the subsequence between indexes 2 and 5, A[2] + A[3] + A[4] + A[5] next we compute the sum of the subsequence between indexes 2 and 6. A[2] + A[3] + A[4] + A[5] + A[6] We already had computed the sum of 2--5, but we compute it again as part of the 2--6 computation. Assuming from the RAM model that each addition takes 1 unit of time, we are wasting 4 add operations!

51 Second algorithm (improved)
still try all possible combinations, but don't redundantly add the sums key observation: in other words, we don't need to throw away partial sums can we use this information to remove one of the loops from our algorithm? // implement together function maxSubsequence2(array[]): What is the runtime (Big-Oh) of this new algorithm? Can it still be improved further?

52 Observations: Claim 1 To make our code even faster, we must avoid trying all possible combinations; to do this, we must find a way to broadly eliminate many potential combinations from consideration. Claim #1: A subsequence with a negative sum cannot be the start of the maximum-sum subsequence.

53 Claim 1, continued Claim #1, more formally: If Ai, j is a subsequence such that , then there is no q such that Ai,q is the maximum-sum subsequence. Proof: (do it together in class) Can this help us produce a better algorithm?

54 Claim 2 Claim #2: when examining subsequences left-to-right, for some starting index i, if Ai,j becomes the first subsequence starting with i , such that Then no part of Ai,j can be part of the maximum-sum subsequence. (Why is this a stronger claim than Claim #1?) Proof: (do it together in class)

55 Claim 2, continued These figures show the possible contents of Ai,j

56 Third (best) algorithm
Can we eliminate another loop from our algorithm? // implement together function maxSubsequence3(array[]): What is its runtime (Big-Oh)? Is there an even better algorithm than this third algorithm? Can you make a strong argument about why or why not? It's hard to get much better, because this algorithm runs in linear time and you must examine every element, so that's about as good as you can do. Asymptotically, that is THE best you can do.

57 Types of runtime analysis
Express the running time as f(N), where N is the size of the input worst case: your enemy gets to pick the input average case: need to assume a probability distribution on the inputs amortized: your enemy gets to pick the inputs/operations, but you only have to guarantee speed over a large number of operations However, even with input size N, cost of an algorithm could vary on different input.


Download ppt "TCSS 342 Lecture Notes Course Overview, Review of Math Concepts,"

Similar presentations


Ads by Google