Tema 2 La Eficiencia de Los Algoritmos

41
1 Departamento de Lenguajes y Sistemas Informáticos UNIVERSIDAD DE ALICANTE TEMA 2 LA EFICIENCIA DE LOS ALGORITMOS 2 La eficiencia de los algoritmos OBJETIVOS Proporcionar la capacidad para analizar con rigor la eficiencia de los algoritmos Distinguir los conceptos de eficiencia en tiempo y en espacio Introducir las bases matemáticas para poder aplicar el criterio asintótico a los conceptos de eficiencia Calcular la complejidad temporal o espacial de un algoritmo recursivo o iterativo Comparar, respecto a eficiencia, distintas soluciones algorítmicas a un mismo problema

Transcript of Tema 2 La Eficiencia de Los Algoritmos

Page 1: Tema 2 La Eficiencia de Los Algoritmos

1

Departamento de Lenguajes y Sistemas Informáticos

UNIVERSIDAD DE ALICANTE

TEMA 2 LA EFICIENCIA DE LOS ALGORITMOS

2

La eficiencia de los algoritmosOBJETIVOS

Proporcionar la capacidad para analizar con rigor la eficiencia de los algoritmos

Distinguir los conceptos de eficiencia en tiempo y en espacioIntroducir las bases matemáticas para poder aplicar el criterio asintótico a los conceptos de eficienciaCalcular la complejidad temporal o espacial de un algoritmo recursivo o iterativoComparar, respecto a eficiencia, distintas soluciones algorítmicas a un mismo problema

Page 2: Tema 2 La Eficiencia de Los Algoritmos

2

3

La eficiencia de los algoritmosCONTENIDO

1. Noción de complejidad2. Cotas de complejidad3. Análisis asintótico4. Cálculo de complejidades

Algoritmos IterativosAlgoritmos Recursivos. Ecuaciones de recurrencia

5. Anexo

4

1. Noción de complejidad¿QUÉ ES UN ALGORITMO?

Un algoritmo es una serie finita de pasos que expresa una forma o estrategia de resolución de un problema.Importante:

El número de pasos debe ser finito. El algoritmo debe terminar en un tiempo finito.El algoritmo debe ser capaz de determinar la solución del problema. Se trata de un método sistemático, susceptible de ser realizado mecánicamente, para resolver un problema dado.

Page 3: Tema 2 La Eficiencia de Los Algoritmos

3

5

1. Noción de complejidadDEFINICIÓN

Complejidad de un algoritmoMedida de los recursos que un algoritmo necesita para su ejecuciónComplejidad temporal: Tiempo que un algoritmo necesita para su ejecuciónComplejidad espacial: Recursos espaciales (de almacén) que un algoritmo consume o necesita para su ejecución

Posibilidad de hacerValoraciones: el algoritmo A es “bueno”, “el mejor”, “prohibitivo”Comparaciones: el algoritmo A es mejor que el B

Nos centraremos en el estudio de la complejidad temporal

6

1. Noción de complejidadCOMPLEJIDAD TEMPORAL

El tiempo de ejecución de un algoritmo depende de:Factores externos

La máquina en la que se va a ejecutarEl compiladorLa experiencia del programadorLos datos de entrada suministrados en cada ejecución

InternosEl número de instrucciones asociadas al algoritmo

¿Cómo estudiamos el tiempo de ejecución de un algoritmo?

Page 4: Tema 2 La Eficiencia de Los Algoritmos

4

7

1. Noción de complejidad¿CÓMO ESTUDIAMOS EL TIEMPO DE EJECUCIÓN?

Análisis empírico (a posteriori):Generando ejecuciones del algoritmo para distintos valores de entrada y cronometrando el tiempo de ejecuciónJ Se obtiene una medida real del comportamiento del algoritmo en el entorno de

aplicaciónL El resultado depende de los factores externos e internos

Análisis analítico (a priori):Obtener una función que represente el tiempo de ejecución del algoritmo para cualquier valor de entradaJ El resultado depende sólo de los factores internosJ Estima el comportamiento del algoritmo de forma independiente de los

factores externosJ No es necesario implementar y ejecutar los algoritmos L No obtiene una medida real del comportamiento del algoritmo en el entorno de

aplicación

Ambas medidas son importantes

8

1. Noción de complejidad¿CÓMO ESTUDIAMOS EL TIEMPO DE EJECUCIÓN?

Se expresa mediante funciones de coste. Permiten determinar el comportamiento de un algoritmo para cualquier entrada posible.Las entradas se expresan mediante lo que denominamos talla, tamaño de la entrada o tamaño del problema.

Talla o tamaño de un problema:Valor o conjunto de valores asociados a la entrada del problema que representa una medida de su tamaño respecto de otras entradas posibles

Denotaremos T(n) al tiempo de ejecución de un algoritmo para una entrada de tamaño n.

Page 5: Tema 2 La Eficiencia de Los Algoritmos

5

9

1. Noción de complejidad ¿CÓMO ESTUDIAMOS EL TIEMPO DE EJECUCIÓN?

¿Qué unidad de medida empleamos para T(n)?¿segundos? No existe unidad concretaNo existe ordenador de referencia para estas medidas

El principio de InvarianzaDado un algoritmo y dos implementaciones I1 e I2 (máquinas o códigos distintos) que tardan en ejecutarse T1(n) y T2(n) , entonces

Es decir, el tiempo de ejecución de dos implementaciones distintas de un algoritmo dado va a diferir como mucho en una constante multiplicativaPor tanto podemos decir que un algoritmo tarda un tiempo del orden deT(n) si y una implementación I del algoritmo que tarda menos que c ·T(n) para cualquier entrada de tamaño n

0 0 1 2, / ( ) · ( )c n n n T n c T n+∃ ∈ ∃ ∈ ∀ ≥ ≤

c +∃ ∈

10

1. Noción de complejidad ¿CÓMO ESTUDIAMOS EL TIEMPO DE EJECUCIÓN?

¿Unidad en función del tipo de análisis?Análisis empírico (a posteriori):

Emplearemos los segundos siempre que se particularice el estudio a la ejecución de una implementación concreta de un algoritmo en una máquina determinada

Análisis analítico (a priori):Necesitamos definir una unidad de medida teórica, independiente de factores externosSe define una unidad de medida (operación elemental o paso de programa) El tiempo de un algoritmo se puede así medir como el número de pasos de programa que realiza para una entrada dada.

Page 6: Tema 2 La Eficiencia de Los Algoritmos

6

11

1. Noción de complejidad CONSIDERACIONES

¿Porqué es importante conocer el coste de ejecución de los algoritmos? ¿Porqué se emplean funciones de coste para expresar el coste de un algoritmo?¿Cómo definimos un paso de programa u operación elemental? ¿Cómo lo identificamos en un algoritmo?

12

1. Noción de complejidad CONSIDERACIONES

¿Porqué es importante conocer el coste de ejecución de los algoritmos?Ejemplo: El cuadrado de un número concreto (1000)

• Diferente coste según algoritmo

• Todos coste constante

funcion Cuad1():entero;devuelve(1000*1000); // 2 //

fin /* 2 */

funcion Cuad2():entero;m=0; // 1 //para i=1 hasta 1000 // 1001+1001 //

m=m+1000; // 1000+1000 //fparadevuelve(m); // 1 //

fin /* 4004 */

Número total de operaciones

1 Paso de programa = 1operación simple

Page 7: Tema 2 La Eficiencia de Los Algoritmos

7

13

1. Noción de complejidadCONSIDERACIONES

¿Porqué se emplean funciones de coste para expresar el coste de un algoritmo?

Necesitamos que la expresión del coste del algoritmo sea válida para cualquier entrada al mismo (se expresa en función de su talla)

Ejemplo: El cuadrado de un número cualquiera (n)funcion Cuad3(n:ent):entero;

devuelve(n*n); // 2 //Fin /* 2 */

funcion Cuad4(n:ent):entero;m=0; // 1 //para i=1 hasta n // n+1+n+1 //

m=m+n; // n+n //fparadevuelve(m); // 1 //

fin /* 4n+4 */

• Diferente coste según algoritmo• Primero: coste constante (No depende de n)• Segundo: coste variable en función de n (talla del problema)

( ) 2f n =

( ) 4 4f n n= +

14

1. Noción de complejidad CONSIDERACIONES

Talla o tamaño de un problema:Valor o conjunto de valores asociados a la entrada del problema que representa una medida de su tamaño respecto de otras entradas posiblesCuad3: - Cuad4:( ) 2f n = ( ) 4 4f n n= +

010203040506070

1 5 10 15tamaño problema

tiem

po

f(n)=2f(n)=4n+4

Page 8: Tema 2 La Eficiencia de Los Algoritmos

8

15

1. Noción de complejidadCONSIDERACIONES

¿Cómo definimos un paso de programa u operación elemental? ¿Cómo lo identificamos en un algoritmo?Paso de programa:

Secuencia de operaciones con contenido semántico cuyo coste es independiente de la talla del problema.Ejemplo:

Opción A: 1 Paso = operación simpleOpción B: 1 Paso = secuencia máxima de operaciones cuyo coste es independiente de la talla del problema

func SUMAR(A:vector[1..n]:ent):ent;(1) s=0(2) para i=1 hasta n hacer(3) s=s+A[i]; Imprime(A[i]);

fpara(4) devuelve(s); fin

Línea Opcion-A Opcion-B(1) 1 1(2) (n+1)(1+1)(3) (n+1)(1+1+1)

(4) 1 1 Suma 5n+7 n+2

n (1)

¿Cuál es la diferencia?

16

1. Noción de complejidadCÁLCULO DEL NÚMERO DE PASOS DE PROGRAMA

Una operación elemental corresponde a un paso de programa. La complejidad de una secuencia consecutiva de instrucciones se calcula sumando los pasos de cada una de las instruccionesEstructuras de selección. El tiempo de ejecución de la sentencia “SI C ENTONCES S1 SINO S2 FINSI” es:

Estructuras repetitivas. El tiempo de ejecución de un bucle “MIENTRAS C HACER S FIN” es:

donde T(C) y T(S) pueden variar en cada iteración, y por tanto habrá que tenerlo en cuenta para su cálculo.El resto de sentencias iterativas se asemeja al bucle MIENTRAS

( ) max{ ( 1), ( 2)}T T C T S T S= +

( ) ( º ) * ( ( ) ( ))T T C n iteraciones T S T C= + +

Page 9: Tema 2 La Eficiencia de Los Algoritmos

9

17

1. Noción de complejidadCÁLCULO DEL NÚMERO DE PASOS DE PROGRAMA

Funciones: El tiempo de ejecución de una llamada a un procedimiento o función F(P1, P2,..., Pn) es 1 (por la llamada), más el tiempo de evaluación de los parámetros P1, P2,..., Pn, más el tiempo que tarde en ejecutarse F, esto es:

El paso de parámetros por referencia, por tratarse simplemente de punteros, no contabilizaEl tiempo de ejecución de las llamadas a procedimientos recursivos va a dar lugar a ecuaciones en recurrencia, que veremos posteriormente.

1 2 1 ( ) ( ) ... ( ) ( )nT T P T P T P T F= + + + + +

18

1. Noción de complejidadEJERCICIOS

funcion ejemplo1 (n:entero):entero;

n=n+1;devuelve(n);

fin

funcion ejemplo2 (n:entero):entero;i=0;mientras (i ≤ 2000)

n=n+1;i=i+1;

fmientras;devuelve(n);

fin

Page 10: Tema 2 La Eficiencia de Los Algoritmos

10

19

1. Noción de complejidadEJERCICIOS

funcion ejemplo3 (n:entero):entero;

j = 2;para i = 1 hasta 2000

j=j*j;fpara;i = 0;mientras (i ≤ n)

j = j + j;j = j - 2;i = i + 1;

fmientras;devuelve(j);

fin

20

1. Noción de complejidadEJERCICIOS

funcion ejemplo5 (n:entero):entero;k = 1;para i=0 hasta n

para j=i hasta nk = k + k;

finparafinparadevuelve(k);

fin

funcion ejemplo4 (n:entero):entero;k = 1;para i=0 hasta n

para j=1 hasta nk = k + k;

finparafinparadevuelve(k);

fin

Page 11: Tema 2 La Eficiencia de Los Algoritmos

11

21

Cálculo de la traspuesta de una matriz

1. Noción de complejidadEJERCICIOS

función TRASPUESTA (var A:matriz) var i,j,filas: entero fvar

filas=numfilas (A);para i=1 hasta filas-1 hacer

para j=i+1 hasta filas hacerb=A[j,i];A[j,i]=A[i,j];A[i,j]=b;

fparafpara

fin

22

Producto de dos matrices

1. Noción de complejidadEJERCICIOS

función PRODUCTO (var A,B:matriz; n,m:entero):matrizvar C:matriz; i,j,k,suma:entero fvar

para i=1 hasta n hacerpara j=1 hasta n hacer

suma=0;para k=1 hasta m hacer

suma= suma + Ai,k * Bk,j;fparaCi,j=suma;

fparafparadevuelve C;

fin

Page 12: Tema 2 La Eficiencia de Los Algoritmos

12

23

2. Cotas de complejidad INTRODUCCION

Dado un vector X de n números naturales y dado un número natural zEncontrar el índice i tal que Xi = zCalcular el número de pasos que realiza

función BUSCAR (var X:vector[N]; z:N):devuelve N;var i:natural fvar;

i=1;mientras (i≤⏐X⏐) ∧ (Xi≠z) hacer

i=i+1;fmientrassi (i=⏐X⏐+1) entonces devuelve(0) (*No encontrado*)

si_no devuelve(i)fin

24

2. Cotas de complejidad EL PROBLEMA

No podemos contar el número de pasos porque para diferentes entradas de un mismo tamaño de problema se obtienen diferentes complejidadesEjemplo:

¿Qué podemos hacer?Acotar el coste mediante dos funciones que expresen respectivamente, el máximo y el mínimo coste del algoritmo (cotas de complejidad)

X z Nº PASOS ( 1, 0, 2, 4 ) 3 1 + 5 + 1 = 7 ( 1, 0, 2, 4 ) 0 1 + 2 + 1 = 4 ( 1, 0, 2, 4 ) 1 1 + 1 + 1 = 3

Page 13: Tema 2 La Eficiencia de Los Algoritmos

13

25

2. Cotas de complejidadLA SOLUCIÓN: Cotas de complejidad

Cuando aparecen diferentes casos para una misma talla genérica n, se introducen las cotas de complejidad

Caso peor: cota superior del algoritmo → Cs(n)Caso mejor: cota inferior del algoritmo → Ci(n)Caso promedio: cota promedio → Cm(n)

Todas son funciones del tamaño del problemaLa cota promedio es difícil de evaluar a priori

Es necesario conocer la distribución de probabilidad de la entradaNo es la media de la inferior y de la superior

26

2. Cotas de complejidadEJEMPLO: Cotas superior e inferior

función BUSCAR (var X:vector[N]; z:N):devuelve Nvar i: natural fvar;(1) i=1;(2) mientras (i≤⏐X⏐) ∧ (Xi≠z) hacer(3) i=i+1;

fmientras(4) si i= ⏐X⏐+1 entonces devuelve 0 si_no devuelve ifin

Línea Mejor Caso Peor Caso (1) 1 1(2,3) 1 n(4) 1 1Suma 3 n+2

Tamaño del problema (n)= Número de elementos del vector X (⏐X⏐)

Cs(n)=n+2Ci (n)=3

Page 14: Tema 2 La Eficiencia de Los Algoritmos

14

27

2. Cotas de complejidad EJEMPLO: Cotas superior e inferior

Complejidad función Buscar

02468

1012141618

1 5 10 15

Ci(n)=3Cs(n)=n+2

Cota Superior

Cota Inferior

¿Cota promedio?

28

3. Análisis asintóticoINTRODUCCION

El estudio de la complejidad resulta realmente interesante para tamaños grandes de problema por varios motivos:

Las diferencias “reales” en tiempo de ejecución de algoritmos con diferente coste para tamaños pequeños de problema no suelen ser muy significativasEs lógico invertir tiempo en el desarrollo de un buen algoritmo sólo si se prevé que éste realizará un gran volumen de operaciones

Al estudio de la complejidad para tamaños grandes de problema se le denomina análisis asintótico

Permite clasificar las funciones de complejidad de forma que podamos compararlas entre si fácilmentePara ello, se definen clases de equivalencia que engloban a las funciones que “crecen de la misma forma” (ver principio de invarianza).Se emplea la notación asintótica

Page 15: Tema 2 La Eficiencia de Los Algoritmos

15

29

3. Análisis asintótico NOTACION ASINTÓTICA

Notación matemática utilizada para representar la complejidad cuando el tamaño de problema (n) es muy grande (n →∞)Se definen tres tipos de notación

Notación O (big-omicron) ⇒ Cota superiorNotación Ω (omega) ⇒ Cota inferiorNotación Θ (big-theta) ⇒ Cota promedio

30

3. Análisis asintóticoCOTA SUPERIOR. NOTACION O

Sea se define el conjunto O(f) como el conjunto de funciones acotadas superiormente por un múltiplo de f :

Dada una función se dice que si existe un múltiplo de f que es cota superior de t

0:f ≥→

{ }00 0( ) : | 0, / g( ) · ( )f g c n n n n c f n≥Ο = → ∃ > ∃ ∈ ∀ ≥ ≤

0:t ≥→ ( )t f∈Ο

Page 16: Tema 2 La Eficiencia de Los Algoritmos

16

31

Sea se define el conjunto O(f) como el conjunto de funciones acotadas superiormente por un múltiplo de f :

Dada una función se dice que si existe un múltiplo de f que es cota superior de t

0:f ≥→

{ }00 0( ) : | 0, / g( ) · ( )f g c n n n n c f n≥Ο = → ∃ > ∃ ∈ ∀ ≥ ≤

0:t ≥→ ( )t f∈Ο

3. Análisis asintóticoCOTA SUPERIOR. NOTACION O

( )t n

· ( )c f n

Ejemplos:

3n + 1 ¿pertenece a O(n) ?3n2 + 1 ¿pertenece a O(n) ?3n2 + 1 ¿pertenece a O(n2)?

32

3. Análisis asintótico NOTACION O : PROPIEDADES

Veamos algunas propiedades de esta notación:1. Dada una función f, entonces 2.

3.

¿Para qué sirven?Nos permiten agrupar en clases aquellas funciones con el mismo crecimientoEjemplo:

¿ O(3n) = O(15n) ?¿ O(349n2) = O(2n2) ?

Las clases resultantes se representan con la función más simple que contienenEjemplo:

O(3n) = O(15n) - Representante : O(n)O(349n2) = O(2n2) - Representante : O(n2)

( )f f∈Ο( ) ( ) ( )f g f g∈Ο ⇒Ο ⊂ Ο

( ) ( ) ( ) ( )f g f g g fΟ = Ο ⇔ ∈Ο ∧ ∈Ο

Page 17: Tema 2 La Eficiencia de Los Algoritmos

17

33

3. Análisis asintótico NOTACION O : PROPIEDADES

Veamos algunas propiedades de esta notación:1. Dada una función f, entonces 2.

3.

¿Para qué sirven?Nos permiten agrupar en clases aquellas funciones con el mismo crecimiento

( )f f∈Ο( ) ( ) ( )f g f g∈Ο ⇒Ο ⊂ Ο

( ) ( ) ( ) ( )f g f g g fΟ = Ο ⇔ ∈Ο ∧ ∈Ο

34

3. Análisis asintótico NOTACION O : MAS PROPIEDADES

Veamos más propiedades interesantes de esta notación:

4.

5.

6. Regla de la suma: 7. Regla del producto:

8.

9.

10.

( ) ( ) ( )f g g h f h∈Ο ∧ ∈Ο ⇒ ∈Ο( ) ( ) (min( , ))f g g h f g h∈Ο ∧ ∈Ο ⇒ ∈Ο

1 1 2 2 1 2 1 2Si ( ) ( ) (max( , ))f g f g f f g g∈Ο ∧ ∈Ο ⇒ + ∈Ο

1 1 2 2 1 2 1 2Si ( ) ( ) · ( · )f g f g f f g g∈Ο ∧ ∈Ο ⇒ ∈Ο

( )lim 0 ( )( )n

f n f gg n→∞

= ⇒ ∈Ο

-1-1 1 0( ) · · ... · ( )m m m

m mf n a n a n a n a n= + + + + ∈Ο

( ) ( ) ( ) ( )f g f g g fΟ ⊂ Ο ⇔ ∈Ο ∧ ∉Ο

Page 18: Tema 2 La Eficiencia de Los Algoritmos

18

35

3. Análisis asintóticoCOTA INFERIOR. NOTACION Ω

Sea se define el conjunto Ω(f) como el conjunto de funciones acotadas inferiormente por un múltiplo de f :

Dada una función se dice que si existe un múltiplo de f que es cota inferior de t

0:f ≥→

{ }00 0( ) : | 0, / g( ) · ( )f g c n n n n c f n≥Ω = → ∃ > ∃ ∈ ∀ ≥ ≥

0:t ≥→ ( )t f∈Ω

36

3. Análisis asintóticoCOTA INFERIOR. NOTACION Ω

Sea se define el conjunto Ω(f) como el conjunto de funciones acotadas inferiormente por un múltiplo de f :

Dada una función se dice que si existe un múltiplo de f que es cota inferior de t

0:f ≥→

{ }00 0( ) : | 0, / g( ) · ( )f g c n n n n c f n≥Ω = → ∃ > ∃ ∈ ∀ ≥ ≥

0:t ≥→ ( )t f∈Ω

( )t n

· ( )c f n

Ejemplos:

3n + 1 ¿pertenece a Ω(n) ?3n2 + 1 ¿pertenece a Ω(n) ?3n2 + 1 ¿pertenece a Ω(n2)?

Page 19: Tema 2 La Eficiencia de Los Algoritmos

19

37

3. Análisis asintótico NOTACION Ω : PROPIEDADES

Veamos algunas propiedades de esta notación:1. Dada una función f, entonces 2.

3.

4.

5.

6. Regla de la suma: 7. Regla del producto:

8.

9.

( )f f∈Ω( ) ( ) ( )f g f g∈Ω ⇒Ω ⊂Ω

( ) ( ) ( ) ( )f g f g g fΩ = Ω ⇔ ∈Ω ∧ ∈Ω( ) ( ) ( )f g g h f h∈Ω ∧ ∈Ω ⇒ ∈Ω( ) ( ) (max( , ))f g g h f g h∈Ω ∧ ∈Ω ⇒ ∈Ω

1 1 2 2 1 2 1 2Si ( ) ( ) ( )f g f g f f g g∈Ω ∧ ∈Ω ⇒ + ∈Ω +1 1 2 2 1 2 1 2Si ( ) ( ) · ( · )f g f g f f g g∈Ω ∧ ∈Ω ⇒ ∈Ω

( )lim 0 ( )( )n

f n g fg n→∞

= ⇒ ∈Ω

-1-1 1 0( ) · · ... · ( ) si 0m m m

m m mf n a n a n a n a n a= + + + + ∈Ω >

38

3. Análisis asintóticoCOTA PROMEDIO. NOTACION Θ

Sea se define el conjunto Θ(f) como el conjunto de funciones acotadas superior e inferiormente por un múltiplo de f :

O lo que es lo mismo: Dada una función se dice que si existen múltiplos de f que son cota superior y cota inferior de t

0:f ≥→

{ }00 0( ) : | , 0, / · ( ) g( ) · ( )f g c d n n n c f n n d f n≥Θ = → ∃ > ∃ ∈ ∀ ≥ ≤ ≤

0:t ≥→ ( )t f∈Θ( ) ( ) ( )f f fΘ = Ο ∩Ω

Page 20: Tema 2 La Eficiencia de Los Algoritmos

20

39

3. Análisis asintóticoCOTA PROMEDIO. NOTACION Θ

Sea se define el conjunto Θ(f) como el conjunto de funciones acotadas superior e inferiormente por un múltiplo de f :

O lo que es lo mismo: Dada una función se dice que si existen múltiplos de f que son cota superior y cota inferior de t

0:f ≥→

{ }00 0( ) : | , 0, / · ( ) g( ) · ( )f g c d n n n c f n n d f n≥Θ = → ∃ > ∃ ∈ ∀ ≥ ≤ ≤

0:t ≥→ ( )t f∈Θ( ) ( ) ( )f f fΘ = Ο ∩Ω

( )t n

· ( )c f n

· ( )d f nEjemplos:

3n + 1 ¿pertenece a Θ(n) ?3n2 + 1 ¿pertenece a Θ(n) ?3n2 + 1 ¿pertenece a Θ(n2)?

40

3. Análisis asintóticoNOTACION Θ : PROPIEDADES

Veamos algunas propiedades de esta notación:1. Dada una función f, entonces 2.

3.

4.

5. Regla de la suma: 6. Regla del producto: 7.

8.

( )f f∈Θ( ) ( ) ( )f g f g∈Θ ⇒Θ = Θ

( ) ( ) ( ) ( )f g f g g fΘ = Θ ⇔ ∈Θ ∧ ∈Θ( ) ( ) ( )f g g h f h∈Θ ∧ ∈Θ ⇒ ∈Θ

1 1 2 2 1 2 1 2Si ( ) ( ) (max( , ))f g f g f f g g∈Θ ∧ ∈Θ ⇒ + ∈Θ

1 1 2 2 1 2 1 2Si ( ) ( ) · ( · )f g f g f f g g∈Θ ∧ ∈Θ ⇒ ∈Θ

( )lim /( 0 ) ( ) ( )( )n

f n k k k f gg n→∞

= ≠ ∧ ≠ ∞ ⇒Θ = Θ

-1-1 1 0( ) · · ... · ( ) si 0m m m

m m mf n a n a n a n a n a= + + + + ∈Θ >

Page 21: Tema 2 La Eficiencia de Los Algoritmos

21

41

Los conjuntos de funciones están incluidos unos en otros generando una ordenación de las diferentes funciones

Las clases más utilizadas en la expresión de complejidades son:

3. Análisis asintóticoJERARQUIA DE FUNCIONES

1( ( ))f nΟ 2( ( ))f nΟ 3( ( ))f nΟ

1

2 2

(1) (lg lg ) (lg ) (lg )

( ) ( ) ( lg )

( ) ( ) (2 ) ( !) ( )

a

a n n

n n n

n O n n n

n n n n

>

>

Ο ⊂Ο ⊂Ο ⊂Ο ⊂

⊂Ο ⊂ ⊂Ο ⊂

⊂Ο ⊂ ⊂Ο ⊂Ο ⊂Ο ⊂Ο

constantes sublogarítmicas logarítmicas

sublineales lineales lineal-logarítmicas

polinómicas exponenciales

42

¿Cuál es la diferencia real entre complejidades?Ejemplo: Máximo tamaño, por hora, que pueden resolver algoritmos cuyo tiempo de ejecución está acotado superiormente por algunas de las funciones anteriores.

La complejidad logarítmica es mucho mejor que la lineal. No requiere mucho esfuerzo plantear soluciones logarítmicas a problemas aparentemente lineales (p.e. la búsqueda de un elemento en un vector ordenado).Ante una complejidad elevada no tiene sentido invertir en hardware para acelerar el tiempo de proceso.

3. Análisis asintóticoJERARQUIA DE FUNCIONES

Complejidad 1 paso=1 ms. 1 paso=0’1 ms.

log n 10106 10107

n 3’6 ⋅ 106 3’6 ⋅ 107

n log n 2 ⋅ 105 2 ⋅ 106

n2 1.897 6000

n3 153 330

2n 21 25

Page 22: Tema 2 La Eficiencia de Los Algoritmos

22

43

3. Análisis asintóticoEJERCICIOS

1..1 1

1.. 11

1. ( ) O( ( )) ( ) O( ( )) ( ) O( ( ))

2. ( ( )) O( ( )) ( ) O( ( )) ( ) O( ( ))

3. ( ) O( ( )) ( ) O ( )

4. ( ) O( ( )) ( ) O max ( )

5. ( ) O(

k k

i i k i ii i

k k

i i k i iii

i i

f n g n g n h n f n h n

f n g n f n g n g n f n

f n g n f n g n

f n g n f n g n

f n g

= =

==

∈ ∧ ∈ ⇔ ∈

Ο = ⇔ ∈ ∧ ∈

⎛ ⎞∈ ⇒ ∈ ⎜ ⎟

⎝ ⎠

⎛ ⎞∈ ⇒ ∈ ⎜ ⎟⎝ ⎠

∏ ∏

1..1 1

1

1

( )) ( ) O ( )

6. O(lg ) O(lg ) , 1

7. O( )

k k

k i ii i

a b

nk k

i

n f n g n

n n a b

i n

= =

+

=

⎛ ⎞⇒ ∈ ⎜ ⎟

⎝ ⎠

= ∀ >

∑ ∑

44

4. Calculo de ComplejidadesINTRODUCCION

Cálculo de la complejidad espacial y temporalNos centraremos en la complejidad temporalEtapas para obtener las cotas de complejidad1. Determinar la talla o tamaño del problema2. Determinar el caso mejor y peor: instancias para las que el algoritmo

tarda más o menosNo siempre existe mejor y peor caso ya que existen algoritmos que se comportan de igual forma para cualquier instancia del mismo tamaño

3. Obtención de las cotas para cada casoAlgoritmos iterativosAlgoritmos recursivos

Page 23: Tema 2 La Eficiencia de Los Algoritmos

23

45

4. Calculo de ComplejidadesALGORITMOS ITERATIVOS

La talla es n y no existe caso mejor ni peor.

función SUMAR (A:vector[1..n]:entero):entero;(1) s=0;(2) para i=1 hasta n hacer(3) s=s+A[i]; Imprime(A[i]);

fpara(4) devuelve(s); fin

Línea Pasos C. Asintótica(1) 1 Θ(1) (2,3) n(1) Θ(n)(4) 1 Θ(1)Suma n+2 Θ(n)

Correlación entre ambas expresiones

46

4. Calculo de ComplejidadesALGORITMOS ITERATIVOS

Línea Cuenta Pasos C.AsintóticaMejor Peor Mejor PeorCaso Caso Caso Caso

(1) 1 1 Ω(1) Ο(1)(2,3) 1 n Ω(1) Ο(n)(4) 1 1 Ω(1) Ο(1)Suma 3 n+2 Ω(1) Ο(n)

Cs(n)=n+2Ci (n)=3

Cs(n)=Ο(n)Ci (n)=Ω(1)

• La talla es el número de elementos del vector (n)• Existe mejor y peor caso ¿cuándo se produce cada uno de ellos?

función BUSCAR (var X:vector[N]; z:N):Nvar i:natural fvar;(1) i=1;(2) mientras (i≤⏐X⏐) ∧ (Xi≠z) hacer(3) i=i+1;

fmientras(4) si i= ⏐X⏐+1 entonces devuelve 0 si_no devuelve ifin

Page 24: Tema 2 La Eficiencia de Los Algoritmos

24

47

Cálculo del máximo de un vector

función MÁXIMO (var v:vector[n]):enterovar i,n,max: entero fvar

n=|v|;max=v[1];para i=2 hasta n hacer

si v[i]>max entonces max=v[i] fsifparadevuelve max;

fin

4. Calculo de ComplejidadesALGORITMOS ITERATIVOS. EJERCICIOS

48

función BUSCA (var v:vector[N]; x,pri,ult:natural):naturalvar m:natural fvar

repetirm= (pri+ult)/2;si v[m]>x entonces ult= m-1

si_no pri= m+1fsi

hasta (pri>ult) ∨ v[m]=x;si v[m]=x entonces devuelve m

si_no devuelve 0fsi

fin

4. Calculo de ComplejidadesALGORITMOS ITERATIVOS. EJERCICIOS

Búsqueda de un elemento en un vector ordenado

Page 25: Tema 2 La Eficiencia de Los Algoritmos

25

49

función F1 (a,n:entero)var i,j:natural fvar

para i=1 hasta n hacerpara j=i hasta 2 hacer (*decreciente*)

F2(a);fpara

fparafin

F2 ∈ Θ(a2)

4. Calculo de ComplejidadesALGORITMOS ITERATIVOS. EJERCICIOS

función SEP (x,y:entero):enterovar i,j,r:natural fvar

para i=0 hasta (x+y) hacerj=i;mientras (j≠0) hacer

j=j div 2;r=r+j;

fmientrasfparadevuelve r;

fin

50

función EJEMPLO (var X:vector[carácter]);var i,j,n:natural fvar

n=|X|;i=2;mientras (n>1) ∧ (i≤n) hacer

j=i;mientras X[j] ≠ X[1] hacer

j=j div 2;fmientrasi=i+1;

fmientrasfin

4. Calculo de ComplejidadesALGORITMOS ITERATIVOS. EJERCICIOS

Page 26: Tema 2 La Eficiencia de Los Algoritmos

26

51

4. Calculo de ComplejidadesALGORITMOS ITERATIVOS. EJERCICIOS

función CALC (var v:vector[natural);var i,j,n,x:natural fvar

n=|v|;si n>0 entonces

j=n; x=0;mientras x<100 hacer

j=j div 2; x=0; i=j;repetir

i=i+1;x=x+v[i];

hasta i=n;si j=0 entonces x=100 fsi

fmientrasImprimir(j);

fsifin

52

4. Calculo de ComplejidadesALGORITMOS ITERATIVOS. EJERCICIOS

funcion PICO (n,m:N):Nvar i,j,x:N;x=0;si (n<=m) entonces

i=n;repetirpara j=1 hasta m*m hacer

x=x+1 fpara;i=i+2;

hasta (i>m);finsi;devuelve x;

fin

Page 27: Tema 2 La Eficiencia de Los Algoritmos

27

53

4. Calculo de ComplejidadesALGORITMOS ITERATIVOS. EJERCICIOS

función ECTO(a: vector[N]; n:N): enterovar i,j:N; permuta:bool;permuta=CIERTO;i=1;mientras (permuta) hacer

i=i+1;permuta=FALSO;para j=n hasta i hacer

si (a[j]<a[j-1]) entoncesx=a[j];permuta=CIERTO;a[j]=a[j-1];a[j-1]=x;

fsifpara

fmientrasfin

54

4. Calculo de ComplejidadesALGORITMOS RECURSIVOS

Dado un algoritmo recursivo:

Podemos obtener el coste de la mayoría de las instrucciones pero, ¿cuál es la contribución al coste total del algoritmo de cada una de las llamadas recursivas?Sólo se puede asegurar que el coste será una función del tamaño del problema f(n) cuyo valor dependerá del coste de las sucesivas llamadas recursivas.

función factorial (n:entero):entero

si n=1 entonces devuelve(1)si_no devuelve(n*factorial(n-1))

fsifin

(1) 1( )

(1) ( 1) 1n

f nf n n

Θ ≤⎧= ⎨Θ + − >⎩

Page 28: Tema 2 La Eficiencia de Los Algoritmos

28

55

4. Calculo de ComplejidadesALGORITMOS RECURSIVOS

Una relación de recurrencia es una expresión que relaciona el valor de una función f definida para un entero n con uno o más valores de la misma función para valores menores que n.

0

0

· ( ( )) ( )( )

'( )a f F n P n n n

f nP n n n

+ >⎧= ⎨ ≤⎩

constante ( ), '( ) Funciones de . No tienen por que ser polinomios

- ( ) Función estrictamente decreciente con . Normalmente

/

aP n P n n

n bF n n n b

n b

• ∈•

⎧• < ∈⎨

56

Las ecuaciones de recurrencia se usan para expresar la complejidad de un algoritmo recursivo aunque también son aplicables a los iterativosSi el algoritmo dispone de mejor y peor caso, habrá una función para cada casoLa complejidad de un algoritmo se obtiene en tres pasos:1. Determinar la talla del algoritmo2. Obtención de las ecuaciones de recurrencia del algoritmo3. Resolución de las ecuaciones

Para resolverlas, usaremos el método de sustitución:Es el método más sencilloSólo para funciones lineales (sólo una vez en función de sí mismas)Consiste en sustituir cada f(n) por su valor al aplicarle de nuevo la función hasta obtener un término general

4. Calculo de ComplejidadesALGORITMOS RECURSIVOS

Page 29: Tema 2 La Eficiencia de Los Algoritmos

29

57

4. Calculo de ComplejidadesALGORITMOS RECURSIVOS

Ejemplo: Calcular la complejidad del siguiente algoritmo

1. Obtener talla (n) del algoritmo (n=i – Num. de elementos del vector) 2. Obtener ecuación de recurrencia a partir del algoritmo

función máximo (a:vector[enteros];i:entero):enterosi i=1 entonces devuelve(a[1])si_no

para j=1 hasta i ESCRIBIR(a[i]) fparadevuelve(MAYOR(máximo(a,i-1),a[i]))

fsifin

ESCRIBIR ∈ Θ(1)MAYOR ∈ Θ(1)

Coste base de recurrencia (NO hay recursión)

Coste caso general de recurrencia (hay recursión)

Coste llamada recursiva

Coste instrucciones no recursivas

(1) 1( )

( ) ( 1) 1n

f nn f n n

Θ =⎧= ⎨Θ + − >⎩

58

4. Calculo de ComplejidadesALGORITMOS RECURSIVOS

Ejemplo: Calcular la complejidad del siguiente algoritmo1. Obtener talla (n) del algoritmo (n=i – Num. de elementos del vector) 2. Obtener ecuación de recurrencia a partir del algoritmo3. Resolver la recurrencia por sustitución

La recursión termina cuando (n-i)=1Por tanto, habrá i=n-1 llamadas recursivas

1

0

( ) ( 1) (1ª rec)

( 1) ( 2) (2ª rec)

( 1) ( 2) ( 3) ... (3ª rec)

( ) ( ) (i-esima rec)i

j

f n n f n

n n f n

n n n f n

n j f n i−

=

= + − =

= + − + − =

= + − + − + − =

= − + −∑

1 2

0 0

2 2

0 0

( ) ( ) ( ) ( ) (1)

( 2)( 1)( ) ( ) (1) ( 1) 12

i n

j j

n n

j j

f n n j f n i n j f

n nn j f n n

− −

= =

− −

= =

= − + − = − +

− −= − + = − − +

∑ ∑

∑ ∑

2( ) ( )f n n⇒ ∈Θ

Page 30: Tema 2 La Eficiencia de Los Algoritmos

30

59

4. Calculo de ComplejidadesALGORITMOS RECURSIVOS

QUICKSORTElemento pivote: Nos sirve para dividir en dos partes el vector

Al azarPrimer elemento → Quicksort primer elementoElemento central → Quicksort centralElemento mediana → Quicksort mediana

Pasos:Elección del pivoteSe hacen dos recorridos del vector: ascendente (i) y descendente (j)El vector queda dividido en dos partes:

parte izquierda del pivote → elementos menores parte derecha del pivote → elementos mayores

Se hacen dos llamadas recursivas. Una con cada parte del vector.

60

4. Calculo de ComplejidadesALGORITMOS RECURSIVOS

QUICKSORT primer elemento

funcion QUICKSORT_CENTINELA (var a:vector; pi,pf:indice)var i,j: indice; x: elemento fvar

si pi<pf entoncesx=a[pi]; i=pi+1; j=pf;repetir

mientras a[i]<x hacer i=i+1 fmientrasmientras a[j]>x hacer j=j-1 fmientrassi i≤j entonces

SWAP(a[i],a[j]); i=i+1; j=j-1;fsi

hasta i>j;SWAP(a[pi],a[j]);QUICKSORT_CENTINELA (a,pi,j-1);QUICKSORT_CENTINELA (a,j+1,pf);

fsifin

Page 31: Tema 2 La Eficiencia de Los Algoritmos

31

61

4. Calculo de ComplejidadesALGORITMOS RECURSIVOS

QUICKSORT Tamaño del problema: nMejor caso: subproblemas (n/2, n /2)

Peor caso: subproblemas (0, n -1),(n -1,0)

(1) 1( )

( ) 12 2

nf n n nn f f n

Θ ≤⎧⎪= ⎨ ⎛ ⎞ ⎛ ⎞Θ + + >⎜ ⎟ ⎜ ⎟⎪ ⎝ ⎠ ⎝ ⎠⎩

( ) ( )(1) 1

( ) ( ) 0 1 1

nf n

n f f n nΘ ≤⎧

= ⎨Θ + + − >⎩

62

4. Calculo de ComplejidadesALGORITMOS RECURSIVOS

QUICKSORTResolución recurrencia mejor caso

La recursión termina cuando (n/2 i)=1Por tanto, habrá i=log2 n llamadas recursivas

( )( )

( ) 2 ( ) (1ª rec)2

2 2 ( ) 2 4 ( ) = (2ª rec)2 4 4

2 4 2 ( ) 3 8 ( ) ... (3ª rec)4 8 8

2 ( ) 2i

i

nf n n f

n n nn f n f

n n nn f n f

nin f

= + =

= + + = +

= + + = + =

= + (i-esima rec)

2 2

( ) 2 ( )2

log (1) log

ii

nf n in f

n n nf n n n

= + =

= + = + 2( ) ( log )f n n n⇒ ∈Ω

Page 32: Tema 2 La Eficiencia de Los Algoritmos

32

63

4. Calculo de ComplejidadesALGORITMOS RECURSIVOS

QUICKSORTResolución recurrencia peor caso

La recursión termina cuando (n-i)=1Por tanto, habrá i=n-1 llamadas recursivas

1

0

( ) ( 1) (1ª rec)

( 1) ( 2) (2ª rec)

( 1) ( 2) ( 3) ... (3ª rec)

( ) ( ) (i-esima rec)i

j

f n n f n

n n f n

n n n f n

n j f n i−

=

= + − =

= + − + − =

= + − + − + − =

= − + −∑

1 2

0 0

2 2

0 0

( ) ( ) ( ) ( ) (1)

( 2)( 1)( ) ( ) (1) ( 1) 12

i n

j j

n n

j j

f n n j f n i n j f

n nn j f n n

− −

= =

− −

= =

= − + − = − +

− −= − + = − − +

∑ ∑

∑ ∑2( ) ( )f n n⇒ ∈Ο

64

4. Calculo de ComplejidadesALGORITMOS RECURSIVOS

Coste QUICKSORT

8

4 4

2 2 2 2

1 1 1 1 1 1 1 1

8

7 1

6 1

5 1

4 1

3 1

2 1

1 1

Caso mejor

Ω(n lg2n)

Caso peor

Ο(n2)

Page 33: Tema 2 La Eficiencia de Los Algoritmos

33

65

4. Calculo de ComplejidadesALGORITMOS RECURSIVOS

QUICKSORT mediana (el pivote es la mediana)

En la versión anterior se cumple que el caso mejor es cuando el elemento seleccionado es la mediana.En este algoritmo estamos forzando el caso mejor.Obtener la mediana

Coste menor que Ο(nlgn)Se aprovecha el recorrido para reorganizar elementos y para encontrar la mediana en la siguiente subllamada.Su complejidad es por tanto de Θ(nlgn).

66

4. Calculo de ComplejidadesALGORITMOS RECURSIVOS: EJERCICIOS

función DESPERDICIO (n:natural)

para i=1 hasta n hacerpara j=1 hasta i hacer

ESCRIBIR i,j,n ;fpara

fparasi n>0 entonces

para i=1 hasta 4 hacerDESPERDICIO(n/2);

fparafsi

fin

ESCRIBIR ∈ Θ(1)

Page 34: Tema 2 La Eficiencia de Los Algoritmos

34

67

4. Calculo de ComplejidadesALGORITMOS RECURSIVOS: EJERCICIOS

función EJEMPLO (n, a:entero):entero;var r:entero fvar;

si a2 > n entonces devuelve 0;si_no

r=EJEMPLO(n,2a);opción

n<(r+a)2 devuelve r;n≥(r+a)2 devuelve r+a;

fopciónfsi

fin

68

4. Calculo de ComplejidadesALGORITMOS RECURSIVOS: EJERCICIOS

funcion ORD(n: N ; v:vector[N]);si (n>0) entonces

ORD(n div 2,v);QuickSortMediana(v,1,n);

fsi;fin

Page 35: Tema 2 La Eficiencia de Los Algoritmos

35

69

4. Calculo de ComplejidadesALGORITMOS RECURSIVOS: EJERCICIOS

función PAL (A:vector[N]; iz,de:N):boolvar n,i:N;n=de-iz+1;opcion

(n <=1): devuelve (CIERTO) ;(n > 1): para i=1 hasta n hacer

Imprimir("A") fpara;si (A[iz]=A[de]) entonces

devuelve(PAL(A,iz+1,de-1));sino

devuelve(FALSO) ;finsi;

fopcionfin

70

5. AnexoEXPRESIONES FRECUENTES

0

2

1

2 3

1

1

1

1

1

1

0

1. (1),

2. ( 1) ( )2

13. ( 1)( ) ( )3 2

4. ( ),

5. ( ) ( ),

16. ( ), 11

n

i

n

i

nk k

i

nk k

i

nni n

i

c c

ni n n

ni n n n

i n k

n i n k

rr r rr

=

=

+

=

+

=

+

=

∈Θ ∀ ∈

= + ∈Θ

= + + ∈Θ

∈Θ ∀ ∈

− ∈Θ ∀ ∈

−= ∈Θ ≠

1

1

1

1

1

0

17. (lg )

18. (1) si 1

9. lg ( lg )

10. 2 2 2 1 ( 2 )

11. 2 (1)

n

i

n

ii

n

i

ni n n n

i

ni

i

ni

rr

i n n

i n n

i

=

=

=

=

=

∈Θ

∈Θ >

∈Θ

= − + ∈Θ

∈Θ

Page 36: Tema 2 La Eficiencia de Los Algoritmos

36

71

5. AnexoEXPRESIONES FRECUENTES

1

1

1

1

1

12. ( ), 1

13. (1), 1

114. (1)!

15. 2 (2 )

16. ! ( )

ni n

i

ni

i

n

i

nn n

i

n

ir nr r

ir r

i

ni

nn ne

=

=

=

=

∈Θ ∀ >

∈Θ ∀ >

∈Θ

⎛ ⎞ = ∈Θ⎜ ⎟⎝ ⎠

⎛ ⎞∈Θ ⎜ ⎟⎝ ⎠

72

0

0

1· 11

1,1

n

n

n

rS a rr

aS r nr

−= >

= < →∞−

progresión geométrica

0·2

nn

a aS n +=

progresión aritmética

5. AnexoSUMA DE SERIES

0

Donde:

Primer elemento de la serie

n-esimo elemento de la serie

Suma de los n primeros elementos de la serie

Razon de la serie geometrica

n

n

a

a

S

r

=

=

=

=

Page 37: Tema 2 La Eficiencia de Los Algoritmos

37

73

2

2 3 1

2 3 1

2 3 1

2 3 1 1 11

1 2

1 2 ( 1)

(1 )

·1 1 1 1

nn

n nn

n nn n

n nn

ni

n n n ni

n

S r r nr

rS r r n r nr

S rS r r r r nr

r S r r r r nr

rr r r r nr nr n rS

r r r r

+

+

+

+ + +=

= + + +

= + + − +

− = + + + −

− = + + + −

+ + + −= − = −

− − − −

progresión aritmético-geométrica

5. AnexoSUMA DE SERIES

74

5. AnexoRECURRENCIAS FRECUENTES

REDUCCIÓN DEL PROBLEMA POR RESTAS (c>0)

0 2

0 /

1 ( )'

( ) Solución: 1 ( )· ( ) ·

1 ( )n c

a nb n n

f n a na f n c b n n n

a a

< →Θ≤⎧

= →Θ⎨ − + >⎩ > →Θ

0

0 /

1 (1)'

( ) Solución: 1 ( )· ( )

1 ( )n c

ab n n

f n a na f n c b n n

a a

< →Θ≤⎧

= →Θ⎨ − + >⎩ > →Θ

0 1

0 /

1 ( )'

( ) Solución: 1 ( )· ( ) ·

1 ( )

k

kk

n c

a nb n n

f n a na f n c b n n n

a a

+

< →Θ≤⎧

= →Θ⎨ − + >⎩ > →Θ

Page 38: Tema 2 La Eficiencia de Los Algoritmos

38

75

5. AnexoRECURRENCIAS FRECUENTES

REDUCCIÓN DEL PROBLEMA POR DIVISIONES (c>1)

0

0 lg

1 ( )'

( ) Solución: 1 ( lg )· ( / )

1 ( )a

a nb n n

f n a n na f n c bn n n

a n

< →Θ≤⎧

= →Θ⎨ + >⎩ > →Θ

0

0 lg

1 (1)'

( ) Solución: 1 (lg )· ( / )

1 ( )a

ab n n

f n a na f n c b n n

a n

< →Θ≤⎧

= →Θ⎨ + >⎩ > →Θ

0

0 lg

( )'

( ) Solución: ( lg )· ( / ) ·

( )

k k

k kk

k a

a c nb n n

f n a c n na f n c b n n n

a c n

< →Θ≤⎧

= →Θ⎨ + >⎩ > →Θ

76

5. AnexoALGORITMOS DE ORDENACION

DirectosInserción directaInserción binariaSelección directaIntercambio directo (burbuja)

AvanzadosMergesort QuicksortHeapsortShell

Page 39: Tema 2 La Eficiencia de Los Algoritmos

39

77

5. AnexoALGORITMOS DE ORDENACION

INSERCIÓN DIRECTA

función INSERCION_DIRECTA (var a:vector[natural]; n: natural)var i,j: entero; x:natural fvar

para i=2 hasta n hacerx=a[i]; j=i-1;mientras (j>0) ∧ (a[j]>x) hacer

a[j+1]=a[j];j=j-1;

fmientrasa[j+1]=x;

fparafin

78

5. AnexoALGORITMOS DE ORDENACION

INSERCIÓN BINARIA

función INSERCION_BINARIA (var a:vector[natural]; n: natural)var i, j, iz, de, m: entero; x:natural fvar

para i=2 hasta n hacerx=a[i]; iz=1; de=i-1;mientras (iz≤de) hacer

m= (iz+de)/2;si a[m]>x entonces de= m-1

si_no iz=m+1fsi

fmientraspara j=i-1 hasta iz hacer (*decreciente*)

a[j+1]=a[j];fparaa[iz]=x;

fparafin

Page 40: Tema 2 La Eficiencia de Los Algoritmos

40

79

5. AnexoALGORITMOS DE ORDENACION

SELECCIÓN DIRECTA

función SELECCION_DIRECTA (var a:vector[natural]; n:natural)var i, j, posmin: entero; min:natural fvar

para i=1 hasta n-1 hacermin=a[i]; posmin=i;para j=i+1 hasta n hacer

si a[j]<min entoncesmin=a[j]; posmin=j;

fsifparaa[posmin]=a[i]; a[i]=min;

fparafin

80

5. AnexoALGORITMOS DE ORDENACION

INTERCAMBIO DIRECTO (Burbuja)

función INTERCAMBIO_DIRECTO (var a:vector[natural]; n:natural )var i,j:entero fvar

para i=2 hasta n hacerpara j=n hasta i hacer

si a[j]<a[j-1] entoncesSWAP(a[j],a[j-1]);

fsifpara

fparafin

Page 41: Tema 2 La Eficiencia de Los Algoritmos

41

81

5. AnexoALGORITMOS DE ORDENACION

QUICKSORT central

función QUICKSORT_SIN_CENTINELA (var a:vector; pi,pf:indice)var i,j: indice; x: elemento fvarcomienzo

si pi<pf entoncesx=a[(pi+pf)/2]; i=pi; j=pf;repetir

mientras a[i]<x hacer i=i+1 fmientrasmientras a[j]>x hacer j=j-1 fmientrassi i≤j entonces

SWAP(a[i],a[j]); i=i+1; j=j-1;fsi

hasta i>j;QUICKSORT_SIN_CENTINELA (a,pi,j);QUICKSORT_SIN_CENTINELA (a,i,pf);

fsifin