oscar f. bedoya l. [email protected] fundamentos de análisis y diseño de algoritmos

114
Oscar F. Bedoya L. [email protected] Fundamentos de análisis y diseño de algoritmos

Upload: maria-josefa-mercedes-villalba-torregrosa

Post on 24-Jan-2016

232 views

Category:

Documents


4 download

TRANSCRIPT

Oscar F. Bedoya L.

[email protected]

Fundamentos de análisis y diseño de algoritmos

Algoritmos en la computación

Un algoritmo es un procedimiento computacional que toma un valor o conjunto de valores como entrada y produce un valor o conjunto de valores como salida

AlgoritmoEntrada Salida

“Un algoritmo se puede ver como una herramienta para resolver un problema computacional bien especificado”

Algoritmos en la computación

Un algoritmo es un procedimiento computacional que toma un valor o conjunto de valores como entrada y produce un valor o conjunto de valores como salida

AlgoritmoEntrada Salida

“Un algoritmo se puede ver como una herramienta para resolver un problema computacional bien especificado”

Entrada/Salida especifican los

problemas

Algoritmos en la computación

Problema 1: Cambio de monedas

Entrada: A={a1, a2, …, an} tal que a1<a2< …<an , PN

Salida: <m1, m2, …, mn> tal que y

es mínimo

n

i ii Pam1*

n

i im1

Algoritmos en la computación

Problema 2: ???

Entrada: nZ+

Salida: 1, si n=2

1, si n=1

1, si n>2 n mod i 0 i {2, …., n-1}

0, si n>2 x | n mod x=0 x {2, …., n-1}

Algoritmos en la computación

Problema 3: ???

Entrada: S=<a1, a2, …, an>

Salida: una permutación de S, S’=<a1’, a2’. …, an’> tal que a1’<a2’<…,<an’

Algoritmos en la computación

Instancia de un problema

<3,12,23,4,9><3,4,9,12,23>

(instancia del problema)

Una instancia es una entrada válida para el algoritmo

Algoritmo de ordenamiento

Algoritmos en la computación

Correctitud

Se dice que un algoritmo es correcto, si para cada instancia, el algoritmo termina con la salida correcta

Algoritmo

Entrada1Salida1

Entrada2

Entradan

Salida2

Salidan

Algoritmos en la computación

primo(int n){

if (n==1)

return 1;

if (n%2==0)

return 0;

else

return 1;

}

Para cada instancia, el algoritmo termina con la salida correcta

¿Es el algoritmo primo correcto?

Algoritmos en la computación

primo(int n){

if (n==1)

return 1;

else{

int c=0;

for (int i=2; i<n; i++)

if (n%i==0) c++;

if (c==0)

return 1;

else return 0;

}

Para cada instancia, el algoritmo termina con la salida correcta

¿Es el algoritmo primo correcto?

Algoritmos en la computación

primo(int n){

if (n==1)

return 1;

else{

int c=0;

for (int i=3; i<n; i++)

if (n%i==0) c++;

if (c==0)

return 1;

else return 0;

}

Para cada instancia, el algoritmo termina con la salida correcta

¿Es el algoritmo primo correcto?

Algoritmos en la computación

Tipos de problemas solucionados utilizando algoritmos:

•Proyecto del genoma humano: Identificar genes en secuencias de ADN que llegan hasta los 10000pb. Se almacena la información observada hasta el momento en bases de datos y se analizan con algoritmos que debe ser eficientes

•Búsquedas en Internet: Dada la cantidad de información indexada, responder de forma correcta la solicitud de una búsqueda en Internet

Algoritmos en la computación

Tipos de problemas solucionados utilizando algoritmos:

•Tratamiento de colisiones de objetos: Detectar una colisión entre dos cuerpos en un espacio 3D

•Búsquedas sobre videos: En un biblioteca, un usuario desea encontrar todos los videos donde aparezca JFK

Algoritmos en la computación

Análisis de algoritmos

Meta: Comparar algoritmos que resuelven un mismo problema

•Correctitud

•Eficiencia

•Tiempo

•Espacio

•Estructuras de datos utilizadas

•Modelo computacional

•El tipo y número de datos con los cuales trabaja (escalabilidad)

Análisis del algoritmo

Insertion sort

Algoritmos en la computación

Insertion sort

Algoritmos en la computación

Insertion sort

Algoritmos en la computación

Insertion sort

Algoritmos en la computación

Insertion sort

Algoritmos en la computación

Insertion sort

Se recorre de derecha a izquierda buscando el lugar

que debe ocupar

Algoritmos en la computación

Insertion sort

Algoritmos en la computación

Insertion sort

Algoritmos en la computación

Insertion sort

Algoritmos en la computación

Insertion sort

Algoritmos en la computación

Insertion sort

Algoritmos en la computación

Insertion sort

Algoritmos en la computación

Insertion sort

Algoritmos en la computación

Insertion sort

Algoritmos en la computación

Insertion sort

Algoritmos en la computación

Insertion sort

Algoritmos en la computación

Insertion sort

Algoritmos en la computación

Insertion sort

Algoritmos en la computación

Insertion sort

Algoritmos en la computación

Insertion sort

10 3 2 6 9A:

Algoritmos en la computación

Insertion sort

Desarrolle el algoritmo

INSERTION-SORT(A)

10 3 2 6 9A:

Algoritmos en la computación

INSERTION-SORT(A)

1 for j2 to length[A]

2 do keyA[j]

3 ij-1

4 while i >0 and A[i] > key

5 do A[i+1]A[i]

6 ii-1

7 A[i+1]key

Algoritmos en la computación

INSERTION-SORT(A)

1 for j2 to length[A]

2 do keyA[j]

3 ij-1

4 while i >0 and A[i] > key

5 do A[i+1]A[i]

6 ii-1

7 A[i+1]key

10 3 2 6 9

Algoritmos en la computación

INSERTION-SORT(A)

1 for j2 to length[A]

2 do keyA[j]

3 ij-1

4 while i >0 and A[i] > key

5 do A[i+1]A[i]

6 ii-1

7 A[i+1]key

10 3 2 6 9

j=2

Key=A[2]=3

Algoritmos en la computación

INSERTION-SORT(A)

1 for j2 to length[A]

2 do keyA[j]

3 ij-1

4 while i >0 and A[i] > key

5 do A[i+1]A[i]

6 ii-1

7 A[i+1]key

10 3 2 6 9

j=2

Key=A[2]=3

i=1

Algoritmos en la computación

INSERTION-SORT(A)

1 for j2 to length[A]

2 do keyA[j]

3 ij-1

4 while i >0 and A[i] > key

5 do A[i+1]A[i]

6 ii-1

7 A[i+1]key

10 10 2 6 9

j=2

Key=A[2]=3

i=0

Algoritmos en la computación

INSERTION-SORT(A)

1 for j2 to length[A]

2 do keyA[j]

3 ij-1

4 while i >0 and A[i] > key

5 do A[i+1]A[i]

6 ii-1

7 A[i+1]key

3 10 2 6 9

A[1]=3

Algoritmos en la computación

INSERTION-SORT(A)

1 for j2 to length[A]

2 do keyA[j]

3 ij-1

4 while i >0 and A[i] > key

5 do A[i+1]A[i]

6 ii-1

7 A[i+1]key

3 10 2 6 9

j=3

Key=A[3]=2

Algoritmos en la computación

INSERTION-SORT(A)

1 for j2 to length[A]

2 do keyA[j]

3 ij-1

4 while i >0 and A[i] > key

5 do A[i+1]A[i]

6 ii-1

7 A[i+1]key

3 10 2 6 9

j=3

Key=A[3]=2

i=2

Algoritmos en la computación

INSERTION-SORT(A)

1 for j2 to length[A]

2 do keyA[j]

3 ij-1

4 while i >0 and A[i] > key

5 do A[i+1]A[i]

6 ii-1

7 A[i+1]key

3 10 10 6 9

j=3

Key=A[3]=2

i=2

Algoritmos en la computación

INSERTION-SORT(A)

1 for j2 to length[A]

2 do keyA[j]

3 ij-1

4 while i >0 and A[i] > key

5 do A[i+1]A[i]

6 ii-1

7 A[i+1]key

3 10 10 6 9

j=3

Key=A[3]=2

i=1

Algoritmos en la computación

INSERTION-SORT(A)

1 for j2 to length[A]

2 do keyA[j]

3 ij-1

4 while i >0 and A[i] > key

5 do A[i+1]A[i]

6 ii-1

7 A[i+1]key

3 3 10 6 9

j=3

Key=A[3]=2

i=0

Algoritmos en la computación

INSERTION-SORT(A)

1 for j2 to length[A]

2 do keyA[j]

3 ij-1

4 while i >0 and A[i] > key

5 do A[i+1]A[i]

6 ii-1

7 A[i+1]key

2 3 10 6 9

j=3

Key=A[3]=2

i=0

Algoritmos en la computación

INSERTION-SORT(A)

1 for j2 to length[A]

2 do keyA[j]

3 ij-1

4 while i >0 and A[i] > key

5 do A[i+1]A[i]

6 ii-1

7 A[i+1]key

2 3 10 6 9

j=4

Key=A[4]=6

i=3

Algoritmos en la computación

INSERTION-SORT(A)

1 for j2 to length[A]

2 do keyA[j]

3 ij-1

4 while i >0 and A[i] > key

5 do A[i+1]A[i]

6 ii-1

7 A[i+1]key

2 3 10 10 9

j=4

Key=A[4]=6

i=3

Algoritmos en la computación

INSERTION-SORT(A)

1 for j2 to length[A]

2 do keyA[j]

3 ij-1

4 while i >0 and A[i] > key

5 do A[i+1]A[i]

6 ii-1

7 A[i+1]key

2 3 10 10 9

j=4

Key=A[4]=6

i=2

Algoritmos en la computación

INSERTION-SORT(A)

1 for j2 to length[A]

2 do keyA[j]

3 ij-1

4 while i >0 and A[i] > key

5 do A[i+1]A[i]

6 ii-1

7 A[i+1]key

2 3 6 10 9

j=4

Key=A[4]=6

i=2

Algoritmos en la computación

INSERTION-SORT(A)

1 for j2 to length[A]

2 do keyA[j]

3 ij-1

4 while i >0 and A[i] > key

5 do A[i+1]A[i]

6 ii-1

7 A[i+1]key

2 3 6 10 9

j=5

Key=A[5]=9

i=4

Algoritmos en la computación

INSERTION-SORT(A)

1 for j2 to length[A]

2 do keyA[j]

3 ij-1

4 while i >0 and A[i] > key

5 do A[i+1]A[i]

6 ii-1

7 A[i+1]key

2 3 6 10 10

j=5

Key=A[5]=9

i=4

Algoritmos en la computación

INSERTION-SORT(A)

1 for j2 to length[A]

2 do keyA[j]

3 ij-1

4 while i >0 and A[i] > key

5 do A[i+1]A[i]

6 ii-1

7 A[i+1]key

2 3 6 10 10

j=5

Key=A[5]=9

i=3

Algoritmos en la computación

INSERTION-SORT(A)

1 for j2 to length[A]

2 do keyA[j]

3 ij-1

4 while i >0 and A[i] > key

5 do A[i+1]A[i]

6 ii-1

7 A[i+1]key

2 3 6 9 10

j=5

Key=A[5]=9

i=3

Algoritmos en la computación

¿Qué es hacer análisis de algoritmos?

•Calcular tiempo de computación

•Espacio (memoria)

•Analizar las estructuras de datos utilizadas

•Identificar el tipo y número de datos de entrada al algoritmo

+ medidas de análisis (tiempo de ejecución)

medidas experimentales

Algoritmos en la computación

¿Qué es hacer análisis de algoritmos?

•Calcular tiempo de computación*

•Espacio (memoria)

•Analizar las estructuras de datos utilizadas

•Identificar el tipo y número de datos de entrada al algoritmo

+ medidas de análisis (tiempo de ejecución)

medidas experimentales

Algoritmos en la computación

primo(int n){

if (n==1)

return 1;

else{

int c=0;

for (int i=2; i<n; i++)

if (n%i==0) c++;

if (c==0)

return 1;

else return 0;

}

¿De qué depende la cantidad de operaciones básicas que realizará el algoritmo para un llamado específico?

Algoritmos en la computación

El tiempo de computo depende del tamaño de la entrada, los tiempos serán diferentes si se ordenan 10 números que si se ordenan 10000.

Además, es posible que para dos entradas de igual tamaño, el tiempo sea diferente. Esto depende, de qué tan ordenado ya se encontraba la secuencia de entrada

Algoritmos en la computación

El tiempo de computo T de un algoritmo depende del tamaño de la entrada,

T(n)=f(n), donde n es el tamaño de la entrada

Algoritmos en la computación

El tiempo de computo T de un algoritmo depende del tamaño de la entrada,

T(n)=f(n), donde n es el tamaño de la entrada

T1(n)=3n2

T2(n)=6n3

por ejemplo, para n=100, se tiene:

T1(n)=3*1002=30.000

T2(n)=6*1003=6.000.000

Algoritmos en la computación

El tiempo de computo T de un algoritmo depende del tamaño de la entrada,

T(n)=f(n), donde n es el tamaño de la entrada

T1(n)=3n2

T2(n)=6n3

por ejemplo, para n=100, se tiene:

T1(n)=3*1002=30.000

T2(n)=6*1003=6.000.000

Operaciones primitivas

Pasos

Instrucciones

Algoritmos en la computación

Note que los pasos ejecutados se calculan independientemente de la máquina y de la implementación

Algoritmos en la computación

Instrucción Costo

Veces que se repite

1 for j2 to length[A]

2 do keyA[j]

3 ij-1

4 while i >0 and A[i] > key

5 do A[i+1]A[i]

6 ii-1

7 A[i+1]key

Algoritmos en la computación

Instrucción Costo

Veces que se repite

1 for j2 to length[A] c1

2 do keyA[j] c2

3 ij-1 c3

4 while i >0 and A[i] > key c4

5 do A[i+1]A[i] c5

6 ii-1 c6

7 A[i+1]key c7

Algoritmos en la computación

Instrucción Costo

Veces que se repite

1 for j1 to length[A] c1

2 print A[j] c2

Algoritmos en la computación

for j1 to 3 for (int j=1; j<=3; j++)

j=1

j=2

j=3

j=4

Algoritmos en la computación

for j1 to 3 for (int j=1; j<=3; j++)

j=1

j=2

j=3

j=4

La cantidad de comparaciones en un for es:

cantidad de números válidos + 1

Algoritmos en la computación

for j1 to 3 for (int j=1; j<=3; j++)

j=1

j=2

j=3

j=4

La cantidad de comparaciones en un for es:

cantidad de números válidos + 1

Cantidad de comparaciones:

3 + 1

Algoritmos en la computación

for j1 to n ¿Cuántas veces se repite?

Algoritmos en la computación

Instrucción Costo

Veces que se repite

1 for j1 to length[A] c1 n+1

2 print A[j] c2 n

Algoritmos en la computación

Instrucción Costo

Veces que se repite

1 for j2 to length[A] c1 ?

2 print A[j] c2 ?

Algoritmos en la computación

for j2 to 4 for (int j=2; j<=4; j++)

j=2

j=3

j=4

j=5

La cantidad de comparaciones en un for es:

cantidad de números válidos + 1

Algoritmos en la computación

for j2 to 4 for (int j=2; j<=4; j++)

j=2

j=3

j=4

j=5

La cantidad de comparaciones en un for es:

(4-2+1) + 1

Algoritmos en la computación

for j2 to 6 for (int j=2; j<=6; j++)

???

Algoritmos en la computación

for j2 to n

La cantidad de comparaciones en el for es:

Algoritmos en la computación

for j2 to n

La cantidad de comparaciones en el for es:

(n-2+1) + 1 = n

Algoritmos en la computación

Instrucción Costo

Veces que se repite

1 for j2 to length[A] c1 ???

2 do keyA[j] c2

3 ij-1 c3

4 while i >0 and A[i] > key c4

5 do A[i+1]A[i] c5

6 ii-1 c6

7 A[i+1]key c7

Algoritmos en la computación

Instrucción Costo

Veces que se repite

1 for j2 to length[A] c1 n

2 do keyA[j] c2

3 ij-1 c3

4 while i >0 and A[i] > key c4

5 do A[i+1]A[i] c5

6 ii-1 c6

7 A[i+1]key c7

Algoritmos en la computación

Instrucción Costo

Veces que se repite

1 for j2 to length[A] c1 n

2 do keyA[j] c2 ???

3 ij-1 c3

4 while i >0 and A[i] > key c4

5 do A[i+1]A[i] c5

6 ii-1 c6

7 A[i+1]key c7

Algoritmos en la computación

Instrucción Costo

Veces que se repite

1 for j2 to length[A] c1 n

2 do keyA[j] c2 n-1

3 ij-1 c3

4 while i >0 and A[i] > key c4

5 do A[i+1]A[i] c5

6 ii-1 c6

7 A[i+1]key c7

Algoritmos en la computación

Instrucción Costo

Veces que se repite

1 for j2 to length[A] c1 n

2 do keyA[j] c2 n-1

3 ij-1 c3 n-1

4 while i >0 and A[i] > key c4

5 do A[i+1]A[i] c5

6 ii-1 c6

7 A[i+1]key c7

Algoritmos en la computación

Instrucción Costo

Veces que se repite

1 for j2 to length[A] c1 n

2 do keyA[j] c2 n-1

3 ij-1 c3 n-1

4 while i >0 and A[i] > key c4

5 do A[i+1]A[i] c5

6 ii-1 c6

7 A[i+1]key c7

Depende de qué tan ordenados se encuentran los datos en A

Algoritmos en la computación

Instrucción Costo

Veces que se repite

1 for j2 to length[A] c1 n

2 do keyA[j] c2 n-1

3 ij-1 c3 n-1

4 while i >0 and A[i] > key c4

5 do A[i+1]A[i] c5

6 ii-1 c6

7 A[i+1]key c7

Para cada j, se puede repetir una cantidad diferente de veces

Algoritmos en la computación

Instrucción Costo

Veces que se repite

1 for j2 to length[A] c1 n

2 do keyA[j] c2 n-1

3 ij-1 c3 n-1

4 while i >0 and A[i] > key c4

5 do A[i+1]A[i] c5

6 ii-1 c6

7 A[i+1]key c7

Sea tj, la cantidad de comparaciones que se hacen en el while para cada valor de j

Por ejemplo, t2,es un número que indica cuántas veces se cumple la condición cuando j=2

Algoritmos en la computación

Instrucción Costo

Veces que se repite

1 for j2 to length[A] c1 n

2 do keyA[j] c2 n-1

3 ij-1 c3 n-1

4 while i >0 and A[i] > key c4 t2 + t3 + t4 + … + tn

5 do A[i+1]A[i] c5

6 ii-1 c6

7 A[i+1]key c7

Por ejemplo, t2,es un número que indica cuántas veces se cumple la condición cuando j=2

Sea tj, la cantidad de comparaciones que se hacen en el while para cada valor de j

Algoritmos en la computación

Instrucción Costo Veces que se repite

1 for j2 to length[A] c1 n

2 do keyA[j] c2 n-1

3 ij-1 c3 n-1

4 while i >0 and A[i] > key c4 t2 + t3 + t4 + … + tn

5 do A[i+1]A[i] c5 (t2-1)+(t3-1)+(t4-1)+ … + (tn-1)

6 ii-1 c6

7 A[i+1]key c7

Algoritmos en la computación

Instrucción Costo Veces que se repite

1 for j2 to length[A] c1 n

2 do keyA[j] c2 n-1

3 ij-1 c3 n-1

4 while i >0 and A[i] > key c4 t2 + t3 + t4 + … + tn

5 do A[i+1]A[i] c5 (t2-1)+(t3-1)+(t4-1)+ … + (tn-1)

6 ii-1 c6 (t2-1)+(t3-1)+(t4-1)+ … + (tn-1)

7 A[i+1]key c7

Algoritmos en la computación

Instrucción Costo Veces que se repite

1 for j2 to length[A] c1 n

2 do keyA[j] c2 n-1

3 ij-1 c3 n-1

4 while i >0 and A[i] > key c4 t2 + t3 + t4 + … + tn

5 do A[i+1]A[i] c5 (t2-1)+(t3-1)+(t4-1)+ … + (tn-1)

6 ii-1 c6 (t2-1)+(t3-1)+(t4-1)+ … + (tn-1)

7 A[i+1]key c7 n-1

Algoritmos en la computación

Instrucción Costo Veces que se repite

1 for j2 to length[A] c1 n

2 do keyA[j] c2 n-1

3 ij-1 c3 n-1

4 while i >0 and A[i] > key c4

5 do A[i+1]A[i] c5

6 ii-1 c6

7 A[i+1]key c7 n-1

n

j jt2

n

j jt2 )1(

n

j jt2 )1(

T(n)=???

Algoritmos en la computación

Instrucción Costo Veces que se repite

1 for j2 to length[A] c1 n

2 do keyA[j] c2 n-1

3 ij-1 c3 n-1

4 while i >0 and A[i] > key c4

5 do A[i+1]A[i] c5

6 ii-1 c6

7 A[i+1]key c7 n-1

n

j jt2

n

j jt2 )1(

n

j jt2 )1(

En el mejor de los casos, cuánto vale tj?

Algoritmos en la computación

INSERTION-SORT(A)

1 for j2 to length[A]

2 do keyA[j]

3 ij-1

4 while i >0 and A[i] > key

5 do A[i+1]A[i]

6 ii-1

7 A[i+1]key

2 3 10 16 19

j=2

t2=?

Algoritmos en la computación

INSERTION-SORT(A)

1 for j2 to length[A]

2 do keyA[j]

3 ij-1

4 while i >0 and A[i] > key

5 do A[i+1]A[i]

6 ii-1

7 A[i+1]key

2 3 10 16 19

j=3

t3=?

Algoritmos en la computación

Instrucción Costo Veces que se repite

1 for j2 to length[A] c1 n

2 do keyA[j] c2 n-1

3 ij-1 c3 n-1

4 while i >0 and A[i] > key c4

5 do A[i+1]A[i] c5

6 ii-1 c6

7 A[i+1]key c7 n-1

n

j jt2

n

j jt2 )1(

n

j jt2 )1(

En el mejor de los casos, tj=1.

T(n)=???

Algoritmos en la computación

Instrucción Costo Veces que se repite

1 for j2 to length[A] c1 n

2 do keyA[j] c2 n-1

3 ij-1 c3 n-1

4 while i >0 and A[i] > key c4

5 do A[i+1]A[i] c5 0

6 ii-1 c6 0

7 A[i+1]key c7 n-1

n

j 21

En el mejor de los casos, tj=1.

T(n)=???

Algoritmos en la computación

Instrucción Costo Veces que se repite

1 for j2 to length[A] c1 n

2 do keyA[j] c2 n-1

3 ij-1 c3 n-1

4 while i >0 and A[i] > key c4

5 do A[i+1]A[i] c5

6 ii-1 c6

7 A[i+1]key c7 n-1

n

j jt2

n

j jt2 )1(

n

j jt2 )1(

En el peor de los casos, cuánto vale tj?

Algoritmos en la computación

INSERTION-SORT(A)

1 for j2 to length[A]

2 do keyA[j]

3 ij-1

4 while i >0 and A[i] > key

5 do A[i+1]A[i]

6 ii-1

7 A[i+1]key

3 2 1 6 9

j=2

t2=?

Algoritmos en la computación

INSERTION-SORT(A)

1 for j2 to length[A]

2 do keyA[j]

3 ij-1

4 while i >0 and A[i] > key

5 do A[i+1]A[i]

6 ii-1

7 A[i+1]key

3 2 1 6 9

j=2

t2=?

i=1

Algoritmos en la computación

INSERTION-SORT(A)

1 for j2 to length[A]

2 do keyA[j]

3 ij-1

4 while i >0 and A[i] > key

5 do A[i+1]A[i]

6 ii-1

7 A[i+1]key

2 3 1 6 9

j=2

t2=?

i=0

Algoritmos en la computación

INSERTION-SORT(A)

1 for j2 to length[A]

2 do keyA[j]

3 ij-1

4 while i >0 and A[i] > key

5 do A[i+1]A[i]

6 ii-1

7 A[i+1]key

2 3 1 6 9

j=3

t3=?

Algoritmos en la computación

Instrucción Costo Veces que se repite

1 for j2 to length[A] c1 n

2 do keyA[j] c2 n-1

3 ij-1 c3 n-1

4 while i >0 and A[i] > key c4

5 do A[i+1]A[i] c5

6 ii-1 c6

7 A[i+1]key c7 n-1

En el peor de los casos, tj=j.

T(n)=???

n

jj

2

n

jj

2)1(

n

jj

2)1(

Algoritmos en la computación

Instrucción Costo Veces que se repite

1 for j2 to length[A] c1 n

2 do keyA[j] c2 n-1

3 ij-1 c3 n-1

4 while i >0 and A[i] > key c4

5 do A[i+1]A[i] c5

6 ii-1 c6

7 A[i+1]key c7 n-1

En el caso promedio, se supone que se necesitan j/2 comparaciones, esto es, tj=j/2.

T(n)=???

2/2

n

jj

n

jj

2)12/(

)12/(2

n

jj

Algoritmos en la computación

Instrucción Costo

1 i=1 c1

2 while i<=len(mat1) c2

3 j1 c3

4 while j<=len(mat2) c4

5 mat3[i][j]mat1[i][j]+mat2[i][j]

c5

6 jj+1 c6

7 ii+1 c7

Calcule el tiempo de computo para el algoritmo

def programa1(mat1, mat2) # suponga que len(mat1)=len(mat2)=n

Algoritmos en la computación Instrucción Costo

1 s0 c1

2 i1 c2

3 while i<=n c3

4 t0 c4

5 j1 c5

6 while j<=i c6

7 tt+1 c7

8 jj+1 c8

9 ss+t c9

10 ii+1 c10

Calcule el tiempo de computo para el algoritmo

def programa2(n)

Algoritmos en la computación Instrucción Costo

1 i1 c1

2 while i<=n c2

3 ki c3

4 while k<=n c4

5 k k+1 c5

6 k1 c6

7 while k<=i c7

8 kk+1 c8

9 ii+1 c9

Calcule el tiempo de computo para el algoritmo

def programa3(n)

Algoritmos en la computación

Diseño de algoritmos

Otras alternativas para el diseño de algoritmos son:

•Aproximación incremental

•Dividir y conquistar

•Programación dinámica

•Técnicas voraces

Algoritmos en la computación

Dividir y conquistar

•Considera recursividad

•Dividir el problema en subproblemas

•Conquistar los subproblemas (solucionarlos recursivamente)

•Combinar las soluciones de los subproblemas para crear la solución al problema original

Algoritmos en la computación

Merge Sort

5 2 4 6 1 3 2 6

5 2 4 6 1 3 2 6

5 2 4 6 1 3 2 6

5 2 4 6 1 3 2 6

Dividir

Algoritmos en la computación

Merge Sort

1 2 2 3 4 5 6 6

2 4 5 6 1 2 3 6

2 5 4 6 1 3 2 6

5 2 4 6 1 3 2 6

Combinar

Algoritmos en la computación

Merge sort

Entrada: <a1, a2, …, an>

•Dividir: <a1, …, aq> <aq+1, …, an>

•Conquistar: a’1a’2… a’q y a’q+1a’q+2… a’n

•Combinar: si a’1a’q+1 y a’2>a’q+1 entonces <a’1,a’q+1, …>

sino …

Algoritmos en la computación

Merge sort

T(n)= 1 n=1

Dividir(n) + Conquistar(n) + Combinar(n)

Algoritmos en la computación

Merge sort

T(n)= 1 n=1

1 + 2T(n/2) + n n>1

al resolver la recurrencia, T(n) = n lg n

Algoritmos en la computación

Análisis de algoritmos Insertion sort y Merge sort

Computador 1 Computador 2

108 instrucciones/seg 106 instrucciones/seg

Implementación 1(Insertion)

Implementación 2(Merge)

2n2 50n*lg n

Algoritmos en la computación

Analisis de algoritmos Insertion sort y Merge sort

Computador 1 Computador 2

108 instrucciones/seg 106 instrucciones/seg

Implementación 1(Insertion)

Implementación 2(Merge)

2n2 50n*lg n

Tiempo 1(Insertion) Tiempo 2(Merge)

2(106)2/108=20.000segs=5.56horas 50*106lg 106/106=1.000segs=16.67 mins

Ordenar un arreglo de 106 números