08.05.2013 Views

Unidad II Fundamentos del Análisis de Algoritmos

Unidad II Fundamentos del Análisis de Algoritmos

Unidad II Fundamentos del Análisis de Algoritmos

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Algoritmos</strong> y Estructuras <strong>de</strong> Datos <strong>Unidad</strong> <strong>II</strong> <strong>Fundamentos</strong> <strong><strong>de</strong>l</strong> <strong>Análisis</strong> <strong>de</strong> <strong>Algoritmos</strong><br />

2.1 Objetivos en la elección <strong>de</strong> un algoritmo<br />

a) Qué el algoritmo sea fácil <strong>de</strong> enten<strong>de</strong>r, codificar y <strong>de</strong>purar.<br />

b) Qué el algoritmo use eficientemente los recursos <strong>de</strong> la computadora y en especial que se ejecute<br />

con la mayor rapi<strong>de</strong>z.<br />

2.1.1 <strong>Análisis</strong> <strong>de</strong> <strong>Algoritmos</strong> vs. <strong>Análisis</strong> Empírico<br />

Una vez que se ha <strong>de</strong>finido un algoritmo para resolver un problema y se ha probado que es correcto, el<br />

siguiente paso es <strong>de</strong>terminar la cantidad <strong>de</strong> recursos tales como tiempo y espacio que el algoritmo<br />

requerirá para su aplicación. La <strong>de</strong>terminación <strong><strong>de</strong>l</strong> tiempo <strong>de</strong> ejecución pue<strong>de</strong> hacerse mediante análisis<br />

empírico o con análisis <strong>de</strong> algoritmos.<br />

<strong>Análisis</strong> empírico.<br />

• La comparación <strong>de</strong> dos o más algoritmos se lleva a cabo ejecutándolos, por lo que requiere que<br />

ambos algoritmos esten correctamente implementados.<br />

• Determina el uso <strong>de</strong> recursos y tiempo requerido en la misma máquina, con los mismos datos y<br />

el mismo ambiente. Por lo tanto es muy importante la selección <strong>de</strong> datos <strong>de</strong> prueba, estos<br />

pue<strong>de</strong>n ser aleatorios, datos reales o datos riesgosos.<br />

• El código pue<strong>de</strong> ejecutarse a diferentes velocida<strong>de</strong>s <strong>de</strong>pendiendo <strong>de</strong> la carga <strong><strong>de</strong>l</strong> sistema.<br />

<strong>Análisis</strong> <strong>de</strong> <strong>Algoritmos</strong><br />

• El análisis matemático es más informativo y barato, pero pue<strong>de</strong> dificultarse si no se conocen<br />

todas las fórmulas matemáticas.<br />

• El código <strong>de</strong> programación <strong>de</strong> alto nivel podría no reflejar correctamente la ejecución en términos<br />

<strong>de</strong> lenguaje máquina. En ocasiones la optimización con la que se haya configurado el compilador<br />

pue<strong>de</strong> afectar el código ejecutable.<br />

• I<strong>de</strong>ntifica las operaciones abstractas en las cuales el algoritmo está basado y separa el análisis<br />

<strong>de</strong> la implementación.<br />

• I<strong>de</strong>ntifica los datos para el mejor caso, el caso promedio y el peor <strong>de</strong> los casos.<br />

2.1.2 Tiempo <strong>de</strong> Ejecución<br />

El tiempo <strong>de</strong> ejecución <strong>de</strong> un algoritmo es una función que mi<strong>de</strong> el número <strong>de</strong> operaciones (elementales<br />

o significativas) que realiza el algoritmo para un tamaño <strong>de</strong> entrada dado. El tiempo <strong>de</strong> ejecución <strong>de</strong> un<br />

algoritmo es, por tanto, función <strong><strong>de</strong>l</strong> tamaño <strong>de</strong> entrada. El valor exacto <strong>de</strong> esta función <strong>de</strong>pen<strong>de</strong> <strong>de</strong><br />

muchos factores, tales como velocidad <strong>de</strong> la máquina, la calidad <strong><strong>de</strong>l</strong> compilador, y en algunos casos, la<br />

calidad <strong><strong>de</strong>l</strong> programa. Por ejemplo: para un mismo procesador efectuar el producto <strong>de</strong> dos números es<br />

mucho más lento si los números son <strong>de</strong> tipo real que si son enteros.<br />

Con mucha frecuencia, el costo <strong>de</strong> un algoritmo <strong>de</strong>pen<strong>de</strong> no solo <strong><strong>de</strong>l</strong> tamaño <strong>de</strong> la entrada sino <strong>de</strong> los<br />

datos en particular.<br />

Se presentan tres posibles situaciones:<br />

a) Tsup(n): costo <strong><strong>de</strong>l</strong> peor caso, el costo máximo <strong><strong>de</strong>l</strong> algoritmo.<br />

b) Tinf(n): costo <strong><strong>de</strong>l</strong> mejor caso, el costo mínimo <strong><strong>de</strong>l</strong> algoritmo.<br />

c) Tmed(n): costo <strong><strong>de</strong>l</strong> caso promedio.<br />

Ing. Alma Leticia Palacios Guerrero Página 1 <strong>de</strong> 13<br />

D:\lety\algoritmos y estructura <strong>de</strong> datos\<strong>Unidad</strong> <strong>II</strong> <strong>Fundamentos</strong> <strong><strong>de</strong>l</strong> <strong>Análisis</strong> <strong>de</strong> <strong>Algoritmos</strong>.doc<br />

Fecha <strong>de</strong> Actualización: 21/02/2007


<strong>Algoritmos</strong> y Estructuras <strong>de</strong> Datos <strong>Unidad</strong> <strong>II</strong> <strong>Fundamentos</strong> <strong><strong>de</strong>l</strong> <strong>Análisis</strong> <strong>de</strong> <strong>Algoritmos</strong><br />

2.1.3 Pseudocódigo.<br />

Pseudocódigo es una herramienta algorítmica que mezcla el lenguaje natural y las construcciones <strong>de</strong><br />

programación <strong>de</strong> alto nivel, para <strong>de</strong>scribir las i<strong>de</strong>as básicas <strong>de</strong> una implementación genérica <strong>de</strong> un<br />

algoritmo.<br />

No hay reglas que <strong>de</strong>terminen que es o no pseudocódigo, ya que varía <strong>de</strong> un programador a otro. El<br />

objetivo <strong><strong>de</strong>l</strong> pseudocódigo es que el programador se concentre en la lógica para solucionar el problema y<br />

no en la sintaxis <strong>de</strong> un lenguaje <strong>de</strong> programación.<br />

2.1.3.1 Reglas <strong><strong>de</strong>l</strong> Pseudocódigo<br />

Tipos <strong>de</strong> datos<br />

Numérico: Entero y Real.<br />

Lógico<br />

Caracter<br />

Ca<strong>de</strong>nas<br />

Operadores Aritméticos Operadores <strong>de</strong> Relación Operadores <strong>de</strong> Lógicos<br />

- Menos Unitario = Igual no negación lógica<br />

* Multiplicación Distinto Y And<br />

/ División Real < Menor que O Or<br />

^ Exponenciación > Mayor que O_X O exclusiva<br />

+ Adición = Mayor o igual que imp Implicación<br />

mod Módulo<br />

div División Entera<br />

Jerarquía <strong>de</strong> los Operandos<br />

( ) Paréntesis<br />

^ Exponenciación<br />

no Operador Unario<br />

*,/,div, mod, Y Operadores Multiplicativos<br />

+,-,O, O_X Operadores Aditivos<br />

=,,,>=,


<strong>Algoritmos</strong> y Estructuras <strong>de</strong> Datos <strong>Unidad</strong> <strong>II</strong> <strong>Fundamentos</strong> <strong><strong>de</strong>l</strong> <strong>Análisis</strong> <strong>de</strong> <strong>Algoritmos</strong><br />

Índices <strong>de</strong> Arreglo: A[i] representa la i-ésima celda <strong><strong>de</strong>l</strong> arreglo A. Las celdas <strong>de</strong> un arreglo A <strong>de</strong> n<br />

celdas se i<strong>de</strong>ntifican con los índices A[0] hasta A[n-1].<br />

Llamadas <strong>de</strong> método: objeto.método(args); don<strong>de</strong> objeto es opcional si se sobreentien<strong>de</strong> qué objeto<br />

hace la llamada.<br />

Retornos <strong>de</strong> método: return valor. Devuelve el valor especificado al método que hizo la la llamada.<br />

Es conveniente comenzar un algoritmo con una breve explicación <strong>de</strong> sus entradas y salidas, lo qué hace<br />

y las i<strong>de</strong>as principales que se usan en él.<br />

2.1.3.2 Ejemplo <strong>de</strong> Pseudocódigo<br />

/*Búsqueda <strong>de</strong> un elemento*/<br />

int busqueda (int vector[],int n, int b)<br />

{ int i, pos;<br />

i=0;<br />

pos=-1;<br />

do<br />

{ if (vector[i]==b)<br />

pos=i;<br />

i++;<br />

}while(pos==-1 &&i


<strong>Algoritmos</strong> y Estructuras <strong>de</strong> Datos <strong>Unidad</strong> <strong>II</strong> <strong>Fundamentos</strong> <strong><strong>de</strong>l</strong> <strong>Análisis</strong> <strong>de</strong> <strong>Algoritmos</strong><br />

2.2.3 Series<br />

n<br />

∑ =<br />

1) i<br />

2<br />

n+<br />

1<br />

= 2 −1<br />

i 0<br />

n<br />

i<br />

2 ) ∑ a<br />

i=<br />

0<br />

n+<br />

1<br />

a −1<br />

=<br />

a −1<br />

n<br />

i<br />

3) ∑ a<br />

i=<br />

0<br />

1<br />

=<br />

1−<br />

a<br />

n n(<br />

n + 1)<br />

4)<br />

∑ i =<br />

i=<br />

1 2<br />

)<br />

n<br />

2 n n + 1 2n<br />

+ 1<br />

i =<br />

6<br />

5 ∑<br />

i=<br />

1<br />

6)<br />

7)<br />

8 )<br />

9)<br />

n<br />

∑<br />

i=<br />

1<br />

N<br />

∑<br />

i=<br />

1<br />

n<br />

∑<br />

i=1<br />

N<br />

∑<br />

i=<br />

n0<br />

i<br />

k<br />

para 0>a>1<br />

( )( )<br />

k + 1<br />

n<br />

= , k ≠ 1<br />

k + 1<br />

1<br />

≈ log<br />

i<br />

f<br />

f<br />

e<br />

N<br />

( n)<br />

= nf ( n)<br />

N<br />

0<br />

( i)<br />

= f ( i)<br />

− f ( i)<br />

∑<br />

i=<br />

1<br />

n −1<br />

∑<br />

i=<br />

1<br />

Ing. Alma Leticia Palacios Guerrero Página 4 <strong>de</strong> 13<br />

D:\lety\algoritmos y estructura <strong>de</strong> datos\<strong>Unidad</strong> <strong>II</strong> <strong>Fundamentos</strong> <strong><strong>de</strong>l</strong> <strong>Análisis</strong> <strong>de</strong> <strong>Algoritmos</strong>.doc<br />

Fecha <strong>de</strong> Actualización: 21/02/2007


<strong>Algoritmos</strong> y Estructuras <strong>de</strong> Datos <strong>Unidad</strong> <strong>II</strong> <strong>Fundamentos</strong> <strong><strong>de</strong>l</strong> <strong>Análisis</strong> <strong>de</strong> <strong>Algoritmos</strong><br />

2.3 Recursión<br />

El concepto <strong>de</strong> recursión es fundamental en Matemáticas y Ciencias <strong>de</strong> la Computación. La <strong>de</strong>finición<br />

más simple es que un programa recursivo es aquel que se invoca a sí mismo. 3. La recursión se utiliza<br />

porque permite expresar algoritmos complejos en forma compacta y elegante sin reducir la eficiencia.<br />

Un algoritmo recursivo es aquel que resuelve un problema resolviendo una o más instancias menores<br />

que el mismo problema. Los algoritmos recursivos se implementan con métodos recursivos.<br />

Reglas <strong>de</strong> la recursión<br />

1) Caso base. Siempre <strong>de</strong>be existir casos base que se resuelven sin hacer uso <strong>de</strong> la recursión.<br />

2) Progreso. Cualquier llamada recursiva <strong>de</strong>be progresar hacia un caso base.<br />

3) Diseño. Asumir que toda llamada recursiva interna funciona correctamente.<br />

4) Regla <strong>de</strong> Interés compuesto: Evitar duplicar el trabajo resolviéndo la misma instancia <strong>de</strong> un<br />

problema en llamadas recursivas compuestas.<br />

Ejemplo 1: Cálculo <strong><strong>de</strong>l</strong> n número <strong>de</strong> la serie fibonacci<br />

int fibonacci (int n)<br />

{ if (n


<strong>Algoritmos</strong> y Estructuras <strong>de</strong> Datos <strong>Unidad</strong> <strong>II</strong> <strong>Fundamentos</strong> <strong><strong>de</strong>l</strong> <strong>Análisis</strong> <strong>de</strong> <strong>Algoritmos</strong><br />

En vez <strong>de</strong> <strong>de</strong>terminar el tiempo exacto <strong>de</strong> ejecución <strong>de</strong> cada operación primitiva, sólo se contarán<br />

cuántas operaciones primitivas se ejecutan y esta cantidad se usará como estimado, en alto nivel, <strong><strong>de</strong>l</strong><br />

tiempo <strong>de</strong> ejecución <strong><strong>de</strong>l</strong> algoritmo.<br />

En un análisis <strong>de</strong> algoritmos es útil enfocarse en la tasa <strong>de</strong> crecimiento <strong><strong>de</strong>l</strong> tiempo <strong>de</strong> ejecución, en<br />

función <strong><strong>de</strong>l</strong> tamaño n <strong>de</strong> la entrada, adoptando un método <strong>de</strong> panorámica y no <strong>de</strong>tenerse en los<br />

pequeños <strong>de</strong>talles. Se formaliza este método <strong>de</strong> analizar estructuras <strong>de</strong> datos y algoritmos usando una<br />

notación matemática para funciones, que no tiene en cuenta a los factores constantes.<br />

Funciones <strong>de</strong> Crecimiento Típicas<br />

C Constante La mayoría <strong>de</strong> las instrucciones se ejecutan una o cuando mucho unas<br />

cuantas veces. Si todas las instrucciones <strong>de</strong> un programa tienen esta<br />

propiedad, <strong>de</strong>cimos que el tiempo <strong>de</strong> ejecución <strong><strong>de</strong>l</strong> programa es constante.<br />

Esta función <strong>de</strong> crecimiento, es <strong>de</strong>seable, pero difícil <strong>de</strong> conseguir<br />

log N Logarítmicas Cuando el tiempo <strong>de</strong> ejecución <strong>de</strong> un programa es logarítmico el programa es<br />

ligeramente más rápido que el crecimiento <strong>de</strong> N. Esta función <strong>de</strong> crecimiento<br />

se presenta en programas que solucionan un problema transformándolo en<br />

una serie <strong>de</strong> pequeños problemas, esto es, divi<strong>de</strong>n el tamaño <strong><strong>de</strong>l</strong> problema en<br />

una fracción constante en cada iteración. Para nuestro interés<br />

consi<strong>de</strong>raremos el tiempo <strong>de</strong> ejecución menor al <strong>de</strong> una constante gran<strong>de</strong>. La<br />

base <strong><strong>de</strong>l</strong> logaritmo cambia la constante, pero no por mucho, por ejemplo,<br />

cuando N=1000, log10N=3 y log2N=9.96; cuando N=1000000 log10N=6 y<br />

log2N=19.93. Se observa que cada que N se duplica, el log N se incrementa<br />

en una constante, pero no se duplica hasta que N es N 2 .<br />

N Lineal El tiempo <strong>de</strong> ejecución lineal, generalmente se encuentra cuando cada<br />

elemento <strong>de</strong> entrada requiere una pequeña parte <strong>de</strong> procesamiento. Cuando<br />

N es 10000 el tiempo <strong>de</strong> ejecución también. Cuando N se duplica el tiempo<br />

también se duplica. Esta situación es óptima para un algoritmo que <strong>de</strong>be<br />

procesar N entradas.<br />

NlogN NlogN El tiempo <strong>de</strong> ejecución NlogN se presenta cuando los algoritmos solucionan<br />

un problema dividiéndolo en pequeños problemas, los resuelve en forma<br />

in<strong>de</strong>pendiente y luego combina las soluciones. Cuando N es 1,000,000 NlogN<br />

es 20,000,000. Cuando N se duplica el tiempo aumenta un poco más <strong><strong>de</strong>l</strong><br />

doble. Esta función <strong>de</strong> crecimiento es típica <strong>de</strong> los algoritmos divi<strong>de</strong> y<br />

vencerás.<br />

N² cuadrática Cuando el tiempo <strong>de</strong> ejecución <strong>de</strong> un algoritmo es cuadrático, el algoritmo<br />

sólo es práctico para problemas relativamente pequeños. Esta función <strong>de</strong><br />

crecimiento surge en algoritmos que procesan todos los pares <strong>de</strong> datos, por<br />

ejemplo, en ciclos anidados. Cuando N=1000 el tiempo <strong>de</strong> ejecución es<br />

100,000. Cuando N se duplica el tiempo <strong>de</strong> ejecución se cuadriplica. Un<br />

ejemplo don<strong>de</strong> se observa esta función <strong>de</strong> crecimiento es el peor caso <strong>de</strong><br />

Quicksort.<br />

N 3 Cúbica Un algoritmo que procesa ternas <strong>de</strong> datos tiene tiempos cúbicos, por ejemplo<br />

la multiplicación <strong>de</strong> matrices implementada en ciclos triples. El uso <strong>de</strong> estos<br />

algoritmos es práctico sólo en problemas pequeños. Cuando N es 100 el<br />

tiempo <strong>de</strong> ejecución es 1,000,000. Al duplicar N el tiempo <strong>de</strong> ejecución se<br />

incrementa 8 veces (2 3 ).<br />

2 N Exponencial Pocos algoritmos con tiempo <strong>de</strong> ejecución exponencial son apropiados para<br />

su uso, aunque surgen naturalmente como soluciones forzadas. Por ejemplo,<br />

cuando N es 20, el tiempo <strong>de</strong> ejecución es 1’000’000. Cuando N se duplica el<br />

tiempo <strong>de</strong> ejecución se eleva al cuadrado.<br />

Ing. Alma Leticia Palacios Guerrero Página 6 <strong>de</strong> 13<br />

D:\lety\algoritmos y estructura <strong>de</strong> datos\<strong>Unidad</strong> <strong>II</strong> <strong>Fundamentos</strong> <strong><strong>de</strong>l</strong> <strong>Análisis</strong> <strong>de</strong> <strong>Algoritmos</strong>.doc<br />

Fecha <strong>de</strong> Actualización: 21/02/2007


<strong>Algoritmos</strong> y Estructuras <strong>de</strong> Datos <strong>Unidad</strong> <strong>II</strong> <strong>Fundamentos</strong> <strong><strong>de</strong>l</strong> <strong>Análisis</strong> <strong>de</strong> <strong>Algoritmos</strong><br />

2.3.1 Notación Asintótica O (<br />

La variable a representa el costo <strong>de</strong> cualquier tarea o labor cotidiana.<br />

c es una constante <strong>de</strong> multiplicación que representa el costo en unida<strong>de</strong>s <strong>de</strong> ejecución <strong>de</strong> una operación<br />

fundamental.<br />

Esta <strong>de</strong>finición se lee T(n) es O <strong>de</strong> f(n). De otra forma, la complejidad <strong>de</strong> una función t(n) está limitada<br />

por la función f(n); es <strong>de</strong>cir, el número máximo <strong>de</strong> operaciones fundamentales ejecutadas por T(n) no<br />

será mayor que f(n). La notación O es similar al menor o igual, cuando estamos refiriéndonos a tasas <strong>de</strong><br />

crecimiento.<br />

En la práctica ignoramos los efectos <strong>de</strong> a, c y cualquier operación <strong>de</strong> poca importancia cuando<br />

comparamos complejida<strong>de</strong>s. La trascen<strong>de</strong>ncia global <strong>de</strong> a tien<strong>de</strong> a ser insignificante conforme el tamaño<br />

<strong><strong>de</strong>l</strong> conjunto <strong>de</strong> la información se incrementa y el costo <strong>de</strong> una operación crítica (c) <strong>de</strong>be ser más o<br />

menos el mismo para algoritmos <strong>de</strong> clase semejante.<br />

La notación Big-Oh tiene tres propósitos:<br />

1. Compensar el error que se comete al ignorar términos pequeños en una fórmula matemática.<br />

2. Compensar el error que se comete al ignorar partes <strong><strong>de</strong>l</strong> programa que contribuye en una pequeña<br />

cantidad <strong>de</strong> tiempo.<br />

3. Permite clasificar algoritmos <strong>de</strong> acuerdo al límite superior <strong>de</strong> su tiempo <strong>de</strong> ejecución.<br />

2.3.1.1 Reglas <strong>de</strong> la Notación O<br />

1) Si T1 ( n)<br />

= Ο(<br />

f ( n)<br />

) y T2 ( n)<br />

= Ο(<br />

g(<br />

n)<br />

)<br />

( n)<br />

+ T ( n)<br />

= Ο(<br />

f ( n)<br />

g(<br />

n))<br />

a +<br />

) T1<br />

2<br />

( n)<br />

. T ( n)<br />

= ( f ( n).<br />

g(<br />

n))<br />

b Ο<br />

) T1<br />

2<br />

, entonces:<br />

n<br />

2) Si T(x) es un polinomio <strong>de</strong> grado n, entonces T ( x)<br />

= Ο(<br />

x )<br />

3) n = Ο(<br />

n)<br />

log para cualquier constante k<br />

k<br />

No se consi<strong>de</strong>ra apropiado incluir factores constantes y términos <strong>de</strong> or<strong>de</strong>n inferior en la notación O. Por<br />

ejemplo, no es correcto <strong>de</strong>cir O(4n²+6n), bastará con indicar O(n²).<br />

Ing. Alma Leticia Palacios Guerrero Página 7 <strong>de</strong> 13<br />

D:\lety\algoritmos y estructura <strong>de</strong> datos\<strong>Unidad</strong> <strong>II</strong> <strong>Fundamentos</strong> <strong><strong>de</strong>l</strong> <strong>Análisis</strong> <strong>de</strong> <strong>Algoritmos</strong>.doc<br />

Fecha <strong>de</strong> Actualización: 21/02/2007


<strong>Algoritmos</strong> y Estructuras <strong>de</strong> Datos <strong>Unidad</strong> <strong>II</strong> <strong>Fundamentos</strong> <strong><strong>de</strong>l</strong> <strong>Análisis</strong> <strong>de</strong> <strong>Algoritmos</strong><br />

2.3.2 Notación Omega (>=)<br />

Existen otras notaciones que nos permiten hacer comparaciones entre funciones. Una <strong>de</strong> ellas es la<br />

notación Omega T ( n)<br />

= Ω(<br />

F(<br />

n)<br />

) , esta indica que la tasa <strong>de</strong> crecimiento <strong>de</strong> T(n) es mayor o igual que<br />

la <strong>de</strong> F(n).<br />

2.3.3 Notación Theta (=)<br />

La notación Theta T ( n)<br />

Θ(<br />

F(<br />

n)<br />

)<br />

= , esta indica que la tasa <strong>de</strong> crecimiento <strong>de</strong> T(n) es igual que la <strong>de</strong><br />

F(n). Cuando utilizamos la notación theta estamos proporcionando no solamente un límite superior <strong><strong>de</strong>l</strong><br />

tiempo <strong>de</strong> ejecución, sino que garantizamos que el análisis que nos lleva a este límite superior es lo más<br />

ajustado posible.<br />

2.4 Mo<strong><strong>de</strong>l</strong>o para el análisis <strong>de</strong> algoritmos<br />

El mo<strong><strong>de</strong>l</strong>o para el análisis <strong>de</strong> algoritmos es una computadora normal, en la cual las instrucciones se<br />

ejecutan secuencialmente. Esta tiene el típico conjunto <strong>de</strong> instrucciones: Asignación, comparación,<br />

suma, etc. El tiempo <strong>de</strong> ejecución <strong>de</strong> cada instrucción será una unidad <strong>de</strong> tiempo. También se asume<br />

una memoria infinita.<br />

2.5 Conteo <strong>de</strong> Operaciones primitivas para el <strong>Análisis</strong> <strong>de</strong> <strong>Algoritmos</strong><br />

1) El acceso a un arreglo a través <strong>de</strong> un índice contará como una operación.<br />

2) La asignación <strong>de</strong> un valor a una variable tiene un tiempo <strong>de</strong> ejecución <strong>de</strong> 1.<br />

3) La inicialización <strong>de</strong> un contador tiene valor <strong>de</strong> 1.<br />

4) La comparación <strong>de</strong> la condición <strong>de</strong> salida <strong>de</strong> un ciclo cuenta como una unidad.<br />

5) El regreso <strong>de</strong> valores <strong>de</strong> una función o método tiene un peso <strong>de</strong> 1.<br />

6) El tiempo <strong>de</strong> ejecución <strong>de</strong> un ciclo es el tiempo <strong>de</strong> ejecución <strong>de</strong> las instrucciones <strong>de</strong>ntro <strong><strong>de</strong>l</strong> ciclo,<br />

multiplicado por el número <strong>de</strong> iteraciones.<br />

7) El tiempo <strong>de</strong> ejecución <strong>de</strong> las instrucciones <strong>de</strong>ntro <strong>de</strong> un grupo <strong>de</strong> ciclos anidados es el tiempo<br />

<strong>de</strong> ejecución <strong>de</strong> las instrucciones multiplicado por el tamaño <strong>de</strong> todos los ciclos.<br />

8) Los enunciados consecutivos solo se suman.<br />

9) El tiempo <strong>de</strong> ejecución <strong>de</strong> una instrucción if-else es el tiempo <strong>de</strong> la condición mas el tiempo <strong>de</strong><br />

la parte verda<strong>de</strong>ra o falsa que requiera mayor tiempo <strong>de</strong> ejecución.<br />

Ing. Alma Leticia Palacios Guerrero Página 8 <strong>de</strong> 13<br />

D:\lety\algoritmos y estructura <strong>de</strong> datos\<strong>Unidad</strong> <strong>II</strong> <strong>Fundamentos</strong> <strong><strong>de</strong>l</strong> <strong>Análisis</strong> <strong>de</strong> <strong>Algoritmos</strong>.doc<br />

Fecha <strong>de</strong> Actualización: 21/02/2007


<strong>Algoritmos</strong> y Estructuras <strong>de</strong> Datos <strong>Unidad</strong> <strong>II</strong> <strong>Fundamentos</strong> <strong><strong>de</strong>l</strong> <strong>Análisis</strong> <strong>de</strong> <strong>Algoritmos</strong><br />

Ejemplo 1:<br />

int encontrarMayor(int arreglo [], int n)<br />

{int mayor, i;<br />

mayor=arreglo[0]; // 2<br />

for (i=0;i


<strong>Algoritmos</strong> y Estructuras <strong>de</strong> Datos <strong>Unidad</strong> <strong>II</strong> <strong>Fundamentos</strong> <strong><strong>de</strong>l</strong> <strong>Análisis</strong> <strong>de</strong> <strong>Algoritmos</strong><br />

2.6.1 Ejemplo<br />

Dado el siguiente algoritmo que suma los elementos <strong>de</strong> una matriz cuadrada <strong>de</strong> tamaño n.<br />

suma=0;<br />

i=0;<br />

while (i


<strong>Algoritmos</strong> y Estructuras <strong>de</strong> Datos <strong>Unidad</strong> <strong>II</strong> <strong>Fundamentos</strong> <strong><strong>de</strong>l</strong> <strong>Análisis</strong> <strong>de</strong> <strong>Algoritmos</strong><br />

2.6.2 Ejercicios. En cada ejercicio encuentre el tiempo <strong>de</strong> ejecución para el peor <strong>de</strong> los casos<br />

consi<strong>de</strong>rando las operaciones significativas.<br />

1) for (i=1;i


<strong>Algoritmos</strong> y Estructuras <strong>de</strong> Datos <strong>Unidad</strong> <strong>II</strong> <strong>Fundamentos</strong> <strong><strong>de</strong>l</strong> <strong>Análisis</strong> <strong>de</strong> <strong>Algoritmos</strong><br />

void main()<br />

{int N=20,i,j,k,suma=0;<br />

clrscr();<br />

for(i=1;i


<strong>Algoritmos</strong> y Estructuras <strong>de</strong> Datos <strong>Unidad</strong> <strong>II</strong> <strong>Fundamentos</strong> <strong><strong>de</strong>l</strong> <strong>Análisis</strong> <strong>de</strong> <strong>Algoritmos</strong><br />

Prácticas para esta <strong>Unidad</strong><br />

1) Aplicando el concepto <strong>de</strong> recursividad encontrar el máximo común divisor <strong>de</strong> dos numero enteros<br />

positivos a y b , según los siguientes criterios:<br />

si a>b entonces mcb(a-b,b)<br />

si a

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!