La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Analysis of Algorithms

Presentaciones similares


Presentación del tema: "Analysis of Algorithms"— Transcripción de la presentación:

1 Analysis of Algorithms
Input Algorithm Output An algorithm is a step-by-step procedure for solving a problem in a finite amount of time.

2 Analysis of Algorithms
Running Time (§3.1) Most algorithms transform input objects into output objects. The running time of an algorithm typically grows with the input size. Average case time is often difficult to determine. We focus on the worst case running time. Easier to analyze Crucial to applications such as games, finance and robotics Analysis of Algorithms

3 Analysis of Algorithms
Experimental Studies Write a program implementing the algorithm Run the program with inputs of varying size and composition Use a method like System.currentTimeMillis() to get an accurate measure of the actual running time Plot the results Analysis of Algorithms

4 Limitations of Experiments
It is necessary to implement the algorithm, which may be difficult Results may not be indicative of the running time on other inputs not included in the experiment. In order to compare two algorithms, the same hardware and software environments must be used Analysis of Algorithms

5 Analysis of Algorithms
Theoretical Analysis Uses a high-level description of the algorithm instead of an implementation Characterizes running time as a function of the input size, n. Takes into account all possible inputs Allows us to evaluate the speed of an algorithm independent of the hardware/software environment Analysis of Algorithms

6 Analysis of Algorithms
Pseudocode (§3.2) Algorithm arrayMax(A, n) Input array A of n integers Output maximum element of A currentMax  A[0] for i  1 to n  1 do if A[i]  currentMax then currentMax  A[i] return currentMax Example: find max element of an array High-level description of an algorithm More structured than English prose Less detailed than a program Preferred notation for describing algorithms Hides program design issues Analysis of Algorithms

7 Analysis of Algorithms
Pseudocode Details Control flow if … then … [else …] while … do … repeat … until … for … do … Indentation replaces braces Method declaration Algorithm method (arg [, arg…]) Input … Output … Method call var.method (arg [, arg…]) Return value return expression Expressions Assignment (like  in Java) Equality testing (like  in Java) n2 Superscripts and other mathematical formatting allowed Analysis of Algorithms

8 The Random Access Machine (RAM) Model
A CPU An potentially unbounded bank of memory cells, each of which can hold an arbitrary number or character 1 2 Memory cells are numbered and accessing any cell in memory takes unit time. Analysis of Algorithms

9 Seven Important Functions (§3.3)
Seven functions that often appear in algorithm analysis: Constant  1 Logarithmic  log n Linear  n N-Log-N  n log n Quadratic  n2 Cubic  n3 Exponential  2n In a log-log chart, the slope of the line corresponds to the growth rate of the function Analysis of Algorithms

10 Analysis of Algorithms
Primitive Operations Basic computations performed by an algorithm Identifiable in pseudocode Largely independent from the programming language Exact definition not important (we will see why later) Assumed to take a constant amount of time in the RAM model Examples: Evaluating an expression Assigning a value to a variable Indexing into an array Calling a method Returning from a method Analysis of Algorithms

11 Counting Primitive Operations (§3.4)
By inspecting the pseudocode, we can determine the maximum number of primitive operations executed by an algorithm, as a function of the input size Algorithm arrayMax(A, n) currentMax  A[0] # operations for i  1 to n  1 do n if A[i]  currentMax then 2(n  1) currentMax  A[i] 2(n  1) { increment counter i } 2(n  1) return currentMax Total 8n  2 Analysis of Algorithms

12 Estimating Running Time
Algorithm arrayMax executes 8n  2 primitive operations in the worst case. Define: a = Time taken by the fastest primitive operation b = Time taken by the slowest primitive operation Let T(n) be worst-case time of arrayMax. Then a (8n  2)  T(n)  b(8n  2) Hence, the running time T(n) is bounded by two linear functions Analysis of Algorithms

13 Growth Rate of Running Time
Changing the hardware/ software environment Affects T(n) by a constant factor, but Does not alter the growth rate of T(n) The linear growth rate of the running time T(n) is an intrinsic property of algorithm arrayMax Analysis of Algorithms

14 Analysis of Algorithms
Constant Factors The growth rate is not affected by constant factors or lower-order terms Examples 102n is a linear function 105n n is a quadratic function Analysis of Algorithms

15 Analysis of Algorithms
Big-Oh Notation (§3.4) Given functions f(n) and g(n), we say that f(n) is O(g(n)) if there are positive constants c and n0 such that f(n)  cg(n) for n  n0 Example: 2n + 10 is O(n) 2n + 10  cn (c  2) n  10 n  10/(c  2) Pick c = 3 and n0 = 10 Analysis of Algorithms

16 Analysis of Algorithms
Big-Oh Example Example: the function n2 is not O(n) n2  cn n  c The above inequality cannot be satisfied since c must be a constant Analysis of Algorithms

17 Analysis of Algorithms
More Big-Oh Examples 7n-2 7n-2 is O(n) need c > 0 and n0  1 such that 7n-2  c•n for n  n0 this is true for c = 7 and n0 = 1 3n3 + 20n2 + 5 3n3 + 20n2 + 5 is O(n3) need c > 0 and n0  1 such that 3n3 + 20n2 + 5  c•n3 for n  n0 this is true for c = 4 and n0 = 21 3 log n + 5 3 log n + 5 is O(log n) need c > 0 and n0  1 such that 3 log n + 5  c•log n for n  n0 this is true for c = 8 and n0 = 2 Analysis of Algorithms

18 Analysis of Algorithms
Big-Oh and Growth Rate The big-Oh notation gives an upper bound on the growth rate of a function The statement “f(n) is O(g(n))” means that the growth rate of f(n) is no more than the growth rate of g(n) We can use the big-Oh notation to rank functions according to their growth rate f(n) is O(g(n)) g(n) is O(f(n)) g(n) grows more Yes No f(n) grows more Same growth Analysis of Algorithms

19 Analysis of Algorithms
Big-Oh Rules If is f(n) a polynomial of degree d, then f(n) is O(nd), i.e., Drop lower-order terms Drop constant factors Use the smallest possible class of functions Say “2n is O(n)” instead of “2n is O(n2)” Use the simplest expression of the class Say “3n + 5 is O(n)” instead of “3n + 5 is O(3n)” Analysis of Algorithms

20 Asymptotic Algorithm Analysis
The asymptotic analysis of an algorithm determines the running time in big-Oh notation To perform the asymptotic analysis We find the worst-case number of primitive operations executed as a function of the input size We express this function with big-Oh notation Example: We determine that algorithm arrayMax executes at most 8n  2 primitive operations We say that algorithm arrayMax “runs in O(n) time” Since constant factors and lower-order terms are eventually dropped anyhow, we can disregard them when counting primitive operations Analysis of Algorithms

21 Computing Prefix Averages
We further illustrate asymptotic analysis with two algorithms for prefix averages The i-th prefix average of an array X is average of the first (i + 1) elements of X: A[i] = (X[0] + X[1] + … + X[i])/(i+1) Computing the array A of prefix averages of another array X has applications to financial analysis Analysis of Algorithms

22 Analysis of Algorithms
Prefix Averages (Quadratic) The following algorithm computes prefix averages in quadratic time by applying the definition Algorithm prefixAverages1(X, n) Input array X of n integers Output array A of prefix averages of X #operations A  new array of n integers n for i  0 to n  1 do n s  X[0] n for j  1 to i do …+ (n  1) s  s + X[j] …+ (n  1) A[i]  s / (i + 1) n return A Analysis of Algorithms

23 Arithmetic Progression
The running time of prefixAverages1 is O( …+ n) The sum of the first n integers is n(n + 1) / 2 There is a simple visual proof of this fact Thus, algorithm prefixAverages1 runs in O(n2) time Analysis of Algorithms

24 Analysis of Algorithms
Prefix Averages (Linear) The following algorithm computes prefix averages in linear time by keeping a running sum Algorithm prefixAverages2(X, n) Input array X of n integers Output array A of prefix averages of X #operations A  new array of n integers n s  for i  0 to n  1 do n s  s + X[i] n A[i]  s / (i + 1) n return A Algorithm prefixAverages2 runs in O(n) time Analysis of Algorithms

25 Analysis of Algorithms
Math you need to Review Summations Logarithms and Exponents Proof techniques Basic probability properties of logarithms: logb(xy) = logbx + logby logb (x/y) = logbx - logby logbxa = alogbx logba = logxa/logxb properties of exponentials: a(b+c) = aba c abc = (ab)c ab /ac = a(b-c) b = a logab bc = a c*logab Analysis of Algorithms

26 Analysis of Algorithms
Relatives of Big-Oh big-Omega f(n) is (g(n)) if there is a constant c > 0 and an integer constant n0  1 such that f(n)  c•g(n) for n  n0 big-Theta f(n) is (g(n)) if there are constants c’ > 0 and c’’ > 0 and an integer constant n0  1 such that c’•g(n)  f(n)  c’’•g(n) for n  n0 Analysis of Algorithms

27 Intuition for Asymptotic Notation
Big-Oh f(n) is O(g(n)) if f(n) is asymptotically less than or equal to g(n) big-Omega f(n) is (g(n)) if f(n) is asymptotically greater than or equal to g(n) big-Theta f(n) is (g(n)) if f(n) is asymptotically equal to g(n) Analysis of Algorithms

28 Analysis of Algorithms
Example Uses of the Relatives of Big-Oh 5n2 is (n2) f(n) is (g(n)) if there is a constant c > 0 and an integer constant n0  1 such that f(n)  c•g(n) for n  n0 let c = 5 and n0 = 1 5n2 is (n) f(n) is (g(n)) if there is a constant c > 0 and an integer constant n0  1 such that f(n)  c•g(n) for n  n0 let c = 1 and n0 = 1 5n2 is (n2) f(n) is (g(n)) if it is (n2) and O(n2). We have already seen the former, for the latter recall that f(n) is O(g(n)) if there is a constant c > 0 and an integer constant n0  1 such that f(n) < c•g(n) for n  n0 Let c = 5 and n0 = 1 Analysis of Algorithms

29 Analysis of Algorithms
Notación Asintótica Q, O, W, o, w Se usa para describir los tiempos de ejecución de algoritmos En lugar de usar tiempos de ejecución exactos, se usa Q(n2) Definido para funciones cuyo dominio es el conjunto de números naturales Determina conjuntos de funciones, en la práctica se usa para comparar dos funciones There are actually 5 kinds of asymptotic notation. How many of you are familiar with all of these? What these symbols do is give us a notation for talking about how fast a function goes to infinity, which is just what we want to know when we study the running times of algorithms. Instead of working out a complicated formula for the exact running time, we can just say that the running time is theta of n^2. That is, the running time is proportional to n^2 plus lower order terms. For most purposes, that’s just what we want to know. One thing to keep in mind is that we’re working with functions defined on the natural numbers. Sometimes I’ll talk (a little) about doing calculus on these functions, but the piont is that we won’t care what, say, f(1/2) is. Analysis of Algorithms

30 Analysis of Algorithms
notación -  Para una función dada g(n), definimos (g(n)) el conjunto de funciones (g(n)) = { f(n): existen constantes positivas c1, c2 and n0 tal que 0  c1g(n)  f(n)  c2g(n), para todo n  n0 } Theta notation may be the one we use the most. Sometimes, when people say “O of n”, they really mean theta(n). When we say that one function is theta of another, we mean that neither function goes to infinity faster than the other. Formally, theta(g(n)) is a set of functions. It’s the set of all functions f(n) such that there exist positive constants c1, c2, and n0 st 0 le c1 g(n) \le f(n) le c2 g(n) for all n ge n0. I’ll stop and let you digest that for a minute. Questions about notation? Graphically, we can see what this means. It doesn’t matter what f does for low n. But there’s some threshold, n0, after which f is bounded between these two different multiples of g(n). Also, the definition tells us that g and f are both nonnegative for large n. This makes sense since we’re interested in running times. When f(n) is theta of g(n), we say that g(n)… Decimos que g(n) es una cota ajustada asintótica para f(n) Analysis of Algorithms

31 Analysis of Algorithms
Ejemplo 10n2 - 3n = Q(n2) Para qué constantes n0, c1, y c2 funciona? Hacemos c1 un poco menor que el coeficiente predominante, y c2 un poco mayor Para comparar órdenes de crecimiento, miramos los términos predominantes So let’s work out an example. First of all, how can you tell, without using the definition, whether two functions have the same order of growth? What part do you look at? So, looking at the leading terms, we see that 10n^2 - 3n = theta(n^2). Now I want you to take some time in class and work out the constants to show it via the definition. Once you have an answer, if everyone else isn’t done yet, compare notes with your neighbors. So there’s different answers. What did people get? [Get white board. . . We really have 2 separate inequalities. The first is c1 g(n) le f(n), and the secondis . . . . . . go back to screen] The thing to realize is that the high-order term will dominate the others, so you can always do this trick of making c1 just a little smaller than the leading coefficient, and c2 a little bigger. And this is why you can compare by just looking at the lead term. Analysis of Algorithms

32 Analysis of Algorithms
Notación - O Para una función dada g(n), definimos O(g(n)) el conjunto de funciones O(g(n)) = {f(n): existen constantes positivas c y n0 tal que 0  f(n)  cg(n) para todo n  n0 } Sometimes we won’t know the exact order of growth. Sometimes the running time depends on the input, or we might be talking about a number of different algorithms. Then we might want to put an upper or lower bound on the order of growth. That’s what big-O and big-Omega are for. Except for Theta, the thing to remember is that the English letters are upper bounds, and the Greek letters are lower bounds. (Theta is both, but it’s only a greek letter.) So O(g(n)) is the set of functions that go to infinity no faster than g. The formal definition is the same as for Theta, except that there is only one c, and you have the inequality. We call g an asymptotic . . . Decimos que g(n) es una cota superior asintótica para f(n) Analysis of Algorithms

33 Analysis of Algorithms
notación -  Para una función dada g(n), definimos (g(n)) el conjunto de funciones (g(n)) = {f(n): existen constantes positivas c y n0 tal que 0  cg(n)  f(n) para todo n  n0 } In the same way, Omega(g(n)) is the set of functions that go to infinity no slower than g(n). Again, the definition is the same except that the inequality reads “0 le c g(n) le f(n)” for all n ge n0. Are there any questions? Decimos que g(n) es una cotas inferior asintótica para f(n) Analysis of Algorithms

34 Analysis of Algorithms
Relación entre Q, W, O Para dos funciones cualesquiera g(n) and f(n), f(n) = (g(n)) si y solo si f(n) = O(g(n)) y f(n) = (g(n)). Por tanto, (g(n)) = O(g(n)) Ç W(g(n)) If you look at the definitions, it’s pretty clear that the definition for being in \theta(g(n)) requires you to satisfy the definitions for O and \tomega. If you go back, you see that, for big enough n, you have to be *both* le than c2 g(n) and ge c1 g(n). Set theoretically, this means that, for any function, Theta is just the int of big O and big Omega. Analysis of Algorithms

35 Analysis of Algorithms
Tiempos de ejecución “El tiempo de ejecución es O(f(n))” Þ El peor caso es O(f(n)) “El tiempo de ejecución es W(f(n))” Þ El mejor caso es W(f(n)) Se puede decir “El pero caso de tiempo de ejecución es W(f(n))” Significa que el peor caso de ejecución es dado por alguna función desconocida g(n) Î W(f(n)) Now let’s talk a little about how we use these capital-letter notations in practice. Then we’ll go on to talk about little o and omega. Sometimes people will say “the running time for this algorithm is O(f(n))”, even though the actual running time depends on the input data. Since big O gives an upper bound, what this means is that the worst case running time is O(f(n)) (That is, no worse than c f(n) for large n) You can talk about the best case running time, and that’s what you mean if you just say “the running time is Omega(f(n)). However, you might instead say the *worst* case running time is Omega(f(n)). This means that you don’t know what the worst case running time is, but you *do* know that it’s asymptotically bounded below by f(n). This comes up a lot when you want to know what the worst case running time is, and you try to approach it from above and below. Here’s an example. Analysis of Algorithms

36 Analysis of Algorithms
Ejemplo Ordenación por inserción toma un tiempo Q(n2) en el peor caso, por eso la ordenación (como problema) es O(n2) Cualquier algoritmo de ordenación debe comprobar cada elemento, por ello la ordenación es W(n) En efecto, usando la ordenación por mezcla, la ordenación es Q(n lg n) en el peor caso This is an example of the notion of inherent complexity that I talked about in the introduction to the course. Suppose you need to sort some data, and you want to know how much time it will take. Suppose the only algorithm you know is insertion sort, which takes Thet(n^2) worst case time. This means that sorting, as a problem, is O(n^2). Remember, this is just telling us that n^2 is an asymptotic upper bound on the running time for sort. That’s why we use the O and not Theta. On the other hand, any sort has to at lesast do something with each item, so sorting is \Omega(n). If the only algorithm you knew for sorting was insertion sort, and you hadn’t proved any fancy theorems, then this is what you’d know about the inherent complexity of quicksort. It would make sense to look for quicker algorithms, because your best algorithm is worse than the known lower bound on the complexity of the problem. However, we know that merge sort is Theta(n lg n) worst-case, and moreover we know that’s the best you can hope for, because the inherent complexity of sorting is Theta n \lg n worst case. Analysis of Algorithms

37 Notación asintótica en Ecuaciones
Se usa para reemplazar expresiones que contienen términos de bajo orden Ejemplo, 4n3 + 3n2 + 2n + 1 = 4n3 + 3n2 + (n) = 4n3 + (n2) = (n3) En ecuaciones, (f(n)) siempre significa una función anónima g(n) Î (f(n)) En el ejemplo anterior, (n2) representa 3n2 + 2n + 1 Another way we use asymptotic notation is to simplify calculations. We can replace groups of terms in an equation with a theta expression. As an example here, we can rewrite 4n^3 … in several ways: as… This may seem bad, since we defined Theta(g(n)) as a set of functions. The way we think about this is that \Theta(f(n)) represents some anonymous function in the set -- that is, some unspecified function that will make the equation come out right. This was the interpretation earlier when we used = where \in might have seemed more correct. Analysis of Algorithms

38 Analysis of Algorithms
Notación-o Para una función dada g(n), definimos o(g(n)) al conjunto de funciones o(g(n)) = {f(n): para una constante positiva c > 0, existe una constante n0 > 0 tal que 0  f(n) < cg(n) para todo n  n0 } f(n) se hace insignificante relativo a g(n) cuando n tiende a infinito: lim [f(n) / g(n)] = 0 n Decimos que g(n) es una cota superior para f(n) que no es asintótica. So far, Theta(g) is the functions that go to infinity essentially at the same speed, O(g) goes to infinity no faster than g, and Omega(g) goes to inf at least as fast as g. Sometimes, we want to say that a function grows strictly faster or slower than g. That’s what the lower case letters are for. So o(g(n)) is the set of functions that, in the long run, become insignificant compared to g. The way we say this formally is that o(g(n)) is the set of f(n) such that … So, if you want g(n) to be twice as big as f(n) you choose a certain n0. If you want it to be 4 times as big, you may have to go to larger values of n, but eventually it will be, and so on. You can express this in terms of limits -- etc. Analysis of Algorithms

39 Analysis of Algorithms
notación-w Para una función dada g(n), definimos w(g(n)) al conjunto de funciones w(g(n)) = {f(n): para una constante positiva c > 0, existe una constante n0 > 0 tal que 0  cg(n) < f(n) para todo n  n0 } f(n) se hace grande relativo a g(n) cuando n tiende a infinito : lim [f(n) / g(n)] =  n Decimos que g(n) es una cota inferior para f(n) que no es asintótica. By now you should know the pattern: little omega of g(n) is the set of functions that grow arbitarily large compared to g(n). (just run through) Analysis of Algorithms

40 Medición de Velocidad

41 Medición de la Velocidad
Medir el tiempo de un algoritmo en un ordenador. Qué necesitamos?

42 Necesidades lenguaje de programación -> programa ordenador
compilador javac datos a usar Peor, mejor y promedio de los casos reloj

43 Analysis of Algorithms
Tiempo en Java long startTime = System.currentTimeMillis(); // devuelve tiempo en milisegundos desde 1/1/1970 GMT // codigo long elapsedTime = System.currentTimeMillis() - startTime; Analysis of Algorithms

44 Analysis of Algorithms
Problema Precisión del reloj: asumimos 100 milisegundos Repetimos el trabajo varias veces para conseguir que el tiempo total sea >= 1 seg con lo que se consigue una precisión de 10%. Preceding measurement code is acceptable only when the elapsed time is large relative to the accuracy of the clock. Analysis of Algorithms

45 Analysis of Algorithms
Tiempo preciso long startTime = System.currentTimeMillis(); long counter; do { counter++; doSomething(); } while (System.currentTimeMillis() - startTime < 1000) long elapsedTime = System.currentTimeMillis() - startTime; float timeForMethod = ((float) elapsedTime)/counter; Analysis of Algorithms

46 Analysis of Algorithms
Esquema del programa long startTime = System.currentTimeMillis(); long counter; do { counter++; // inicializar a[] InsertionSort.insertionSort(a); } while (System.currentTimeMillis() - startTime < 1000) long elapsedTime = System.currentTimeMillis() - startTime; float timeForMethod = ((float) elapsedTime)/counter; Suppose we are measuring worst-case run time. The array a Initially is in descending order. After the first iteration, the data is sorted. Subsequent iterations no longer start with worst-case data. So the measured time is for one Worst-case sort plus counter-1 best-case sorts! Analysis of Algorithms


Descargar ppt "Analysis of Algorithms"

Presentaciones similares


Anuncios Google