Está en la página 1de 114

Fundamentos de análisis y

diseño de algoritmos
Oscar F. Bedoya L.
oscarbed@eisc.univalle.edu.co
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

Entrada Algoritmo 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

Entrada Algoritmo Salida

Entrada/Salida
especifican los
problemas

“Un algoritmo se puede ver como una herramienta para


resolver un problema computacional bien especificado”
Algoritmos en la computación

Problema 1: Cambio de monedas

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


n
Salida: <m1, m2, …, mn> tal que P y
n
i 1
mi * ai i 1
mi
es mínimo
Algoritmos en la computación

Problema 2: ???

Entrada: n Z+
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

Algoritmo de
<3,12,23,4,9> ordenamiento <3,4,9,12,23>
(instancia del problema)

Una instancia es una entrada válida para el algoritmo


Algoritmos en la computación

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

Entrada1 Salida1

Entrada2 Salida2

Algoritmo

Entradan Salidan
Algoritmos en la computación
primo(int n){
Para cada instancia, el
if (n==1) algoritmo termina con la
return 1; salida correcta

if (n%2==0)
¿Es el algoritmo primo
return 0; correcto?
else
return 1;
}
Algoritmos en la computación
primo(int n){
Para cada instancia, el
if (n==1) algoritmo termina con la
return 1; salida correcta

else{
¿Es el algoritmo primo
int c=0; correcto?
for (int i=2; i<n; i++)
if (n%i==0) c++;
if (c==0)
return 1;
else return 0;
}
Algoritmos en la computación
primo(int n){
Para cada instancia, el
if (n==1) algoritmo termina con la
return 1; salida correcta

else{
¿Es el algoritmo primo
int c=0; correcto?
for (int i=3; i<n; i++)
if (n%i==0) c++;
if (c==0)
return 1;
else return 0;
}
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

A: 10 3 2 6 9
Algoritmos en la computación

Insertion sort

Desarrolle el algoritmo
INSERTION-SORT(A)

A: 10 3 2 6 9
Algoritmos en la computación

INSERTION-SORT(A)
1 for j2 to length[A]
2 do keyA[j]
3 ij-1
4 while i >0 and A[i] > key
5 do A[i+1]A[i]
6 ii-1
7 A[i+1]key
Algoritmos en la computación

10 3 2 6 9 INSERTION-SORT(A)
1 for j2 to length[A]
2 do keyA[j]
3 ij-1
4 while i >0 and A[i] > key
5 do A[i+1]A[i]
6 ii-1
7 A[i+1]key
Algoritmos en la computación

10 3 2 6 9 INSERTION-SORT(A)
1 for j2 to length[A]

j=2 2 do keyA[j]
Key=A[2]=3 3 ij-1
4 while i >0 and A[i] > key
5 do A[i+1]A[i]
6 ii-1
7 A[i+1]key
Algoritmos en la computación

10 3 2 6 9 INSERTION-SORT(A)
1 for j2 to length[A]

i=1 j=2 2 do keyA[j]


Key=A[2]=3 3 ij-1
4 while i >0 and A[i] > key
5 do A[i+1]A[i]
6 ii-1
7 A[i+1]key
Algoritmos en la computación

10 10 2 6 9 INSERTION-SORT(A)
1 for j2 to length[A]

i=0 j=2 2 do keyA[j]


Key=A[2]=3 3 ij-1
4 while i >0 and A[i] > key
5 do A[i+1]A[i]
6 ii-1
7 A[i+1]key
Algoritmos en la computación

3 10 2 6 9 INSERTION-SORT(A)
1 for j2 to length[A]

A[1]=3 2 do keyA[j]
3 ij-1
4 while i >0 and A[i] > key
5 do A[i+1]A[i]
6 ii-1
7 A[i+1]key
Algoritmos en la computación

3 10 2 6 9 INSERTION-SORT(A)
1 for j2 to length[A]

j=3 2 do keyA[j]
Key=A[3]=2 3 ij-1
4 while i >0 and A[i] > key
5 do A[i+1]A[i]
6 ii-1
7 A[i+1]key
Algoritmos en la computación

3 10 2 6 9 INSERTION-SORT(A)
1 for j2 to length[A]

i=2 j=3 2 do keyA[j]


Key=A[3]=2 3 ij-1
4 while i >0 and A[i] > key
5 do A[i+1]A[i]
6 ii-1
7 A[i+1]key
Algoritmos en la computación

3 10 10 6 9 INSERTION-SORT(A)
1 for j2 to length[A]

i=2 j=3 2 do keyA[j]


Key=A[3]=2 3 ij-1
4 while i >0 and A[i] > key
5 do A[i+1]A[i]
6 ii-1
7 A[i+1]key
Algoritmos en la computación

3 10 10 6 9 INSERTION-SORT(A)
1 for j2 to length[A]

i=1 j=3 2 do keyA[j]


Key=A[3]=2 3 ij-1
4 while i >0 and A[i] > key
5 do A[i+1]A[i]
6 ii-1
7 A[i+1]key
Algoritmos en la computación

3 3 10 6 9 INSERTION-SORT(A)
1 for j2 to length[A]

i=0 j=3 2 do keyA[j]


Key=A[3]=2 3 ij-1
4 while i >0 and A[i] > key
5 do A[i+1]A[i]
6 ii-1
7 A[i+1]key
Algoritmos en la computación

2 3 10 6 9 INSERTION-SORT(A)
1 for j2 to length[A]

i=0 j=3 2 do keyA[j]


Key=A[3]=2 3 ij-1
4 while i >0 and A[i] > key
5 do A[i+1]A[i]
6 ii-1
7 A[i+1]key
Algoritmos en la computación

2 3 10 6 9 INSERTION-SORT(A)
1 for j2 to length[A]

i=3 j=4 2 do keyA[j]


Key=A[4]=6 3 ij-1
4 while i >0 and A[i] > key
5 do A[i+1]A[i]
6 ii-1
7 A[i+1]key
Algoritmos en la computación

2 3 10 10 9 INSERTION-SORT(A)
1 for j2 to length[A]

i=3 j=4 2 do keyA[j]


Key=A[4]=6 3 ij-1
4 while i >0 and A[i] > key
5 do A[i+1]A[i]
6 ii-1
7 A[i+1]key
Algoritmos en la computación

2 3 10 10 9 INSERTION-SORT(A)
1 for j2 to length[A]

i=2 j=4 2 do keyA[j]


Key=A[4]=6 3 ij-1
4 while i >0 and A[i] > key
5 do A[i+1]A[i]
6 ii-1
7 A[i+1]key
Algoritmos en la computación

2 3 6 10 9 INSERTION-SORT(A)
1 for j2 to length[A]

i=2 j=4 2 do keyA[j]


Key=A[4]=6 3 ij-1
4 while i >0 and A[i] > key
5 do A[i+1]A[i]
6 ii-1
7 A[i+1]key
Algoritmos en la computación

2 3 6 10 9 INSERTION-SORT(A)
1 for j2 to length[A]

i=4 j=5 2 do keyA[j]


Key=A[5]=9 3 ij-1
4 while i >0 and A[i] > key
5 do A[i+1]A[i]
6 ii-1
7 A[i+1]key
Algoritmos en la computación

2 3 6 10 10 INSERTION-SORT(A)
1 for j2 to length[A]

i=4 j=5 2 do keyA[j]


Key=A[5]=9 3 ij-1
4 while i >0 and A[i] > key
5 do A[i+1]A[i]
6 ii-1
7 A[i+1]key
Algoritmos en la computación

2 3 6 10 10 INSERTION-SORT(A)
1 for j2 to length[A]

i=3 j=5 2 do keyA[j]


Key=A[5]=9 3 ij-1
4 while i >0 and A[i] > key
5 do A[i+1]A[i]
6 ii-1
7 A[i+1]key
Algoritmos en la computación

2 3 6 9 10 INSERTION-SORT(A)
1 for j2 to length[A]

i=3 j=5 2 do keyA[j]


Key=A[5]=9 3 ij-1
4 while i >0 and A[i] > key
5 do A[i+1]A[i]
6 ii-1
7 A[i+1]key
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){
¿De qué depende la
if (n==1) cantidad de operaciones
return 1; básicas que realizará el
algoritmo para un
else{ llamado específico?

int c=0;
for (int i=2; i<n; i++)
if (n%i==0) c++;
if (c==0)
return 1;
else return 0;
}
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
Operaciones primitivas
T2(n)=6*1003=6.000.000 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 j2 to length[A]
2 do keyA[j]
3 ij-1
4 while i >0 and A[i] > key
5 do A[i+1]A[i]
6 ii-1
7 A[i+1]key
Algoritmos en la computación

Instrucción Costo Veces que se repite


1 for j2 to length[A] c1
2 do keyA[j] c2
3 ij-1 c3
4 while i >0 and A[i] > key c4
5 do A[i+1]A[i] c5
6 ii-1 c6
7 A[i+1]key c7
Algoritmos en la computación

Instrucción Costo Veces que se repite


1 for j1 to length[A] c1
2 print A[j] c2
Algoritmos en la computación

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

j=1
j=2
j=3
j=4
Algoritmos en la computación

for j1 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 j1 to 3 for (int j=1; j<=3; j++)

j=1 Cantidad de comparaciones:

j=2 3+1

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 j1 to n ¿Cuántas veces se repite?


Algoritmos en la computación

Instrucción Costo Veces que se repite


1 for j1 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 j2 to length[A] c1 ?
2 print A[j] c2 ?
Algoritmos en la computación

for j2 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 j2 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 j2 to 6 for (int j=2; j<=6; j++)

???
Algoritmos en la computación

for j2 to n

La cantidad de comparaciones en el for es:


Algoritmos en la computación

for j2 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 j2 to length[A] c1 ???
2 do keyA[j] c2
3 ij-1 c3
4 while i >0 and A[i] > key c4
5 do A[i+1]A[i] c5
6 ii-1 c6
7 A[i+1]key c7
Algoritmos en la computación

Instrucción Costo Veces que se repite


1 for j2 to length[A] c1 n
2 do keyA[j] c2
3 ij-1 c3
4 while i >0 and A[i] > key c4
5 do A[i+1]A[i] c5
6 ii-1 c6
7 A[i+1]key c7
Algoritmos en la computación

Instrucción Costo Veces que se repite


1 for j2 to length[A] c1 n
2 do keyA[j] c2 ???
3 ij-1 c3
4 while i >0 and A[i] > key c4
5 do A[i+1]A[i] c5
6 ii-1 c6
7 A[i+1]key c7
Algoritmos en la computación

Instrucción Costo Veces que se repite


1 for j2 to length[A] c1 n
2 do keyA[j] c2 n-1
3 ij-1 c3
4 while i >0 and A[i] > key c4
5 do A[i+1]A[i] c5
6 ii-1 c6
7 A[i+1]key c7
Algoritmos en la computación

Instrucción Costo Veces que se repite


1 for j2 to length[A] c1 n
2 do keyA[j] c2 n-1
3 ij-1 c3 n-1
4 while i >0 and A[i] > key c4
5 do A[i+1]A[i] c5
6 ii-1 c6
7 A[i+1]key c7
Algoritmos en la computación

Instrucción Costo Veces que se repite


1 for j2 to length[A] c1 n
2 do keyA[j] c2 n-1
3 ij-1 c3 n-1
4 while i >0 and A[i] > key c4
5 do A[i+1]A[i] c5
6 ii-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 j2 to length[A] c1 n
2 do keyA[j] c2 n-1
3 ij-1 c3 n-1
4 while i >0 and A[i] > key c4
5 do A[i+1]A[i] c5
6 ii-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 j2 to length[A] c1 n
2 do keyA[j] c2 n-1
3 ij-1 c3 n-1
4 while i >0 and A[i] > key c4
5 do A[i+1]A[i] c5
6 ii-1 c6
7 A[i+1]key c7

Sea tj, la cantidad de Por ejemplo, t2,es un número


comparaciones que se hacen que indica cuántas veces se
en el while para cada valor cumple la condición cuando
de j j=2
Algoritmos en la computación

Instrucción Costo Veces que se repite


1 for j2 to length[A] c1 n
2 do keyA[j] c2 n-1
3 ij-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 ii-1 c6
7 A[i+1]key c7

Sea tj, la cantidad de Por ejemplo, t2,es un número


comparaciones que se hacen que indica cuántas veces se
en el while para cada valor cumple la condición cuando
de j j=2
Algoritmos en la computación

Instrucción Costo Veces que se repite


1 for j2 to length[A] c1 n
2 do keyA[j] c2 n-1
3 ij-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 ii-1 c6
7 A[i+1]key c7
Algoritmos en la computación

Instrucción Costo Veces que se repite


1 for j2 to length[A] c1 n
2 do keyA[j] c2 n-1
3 ij-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 ii-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 j2 to length[A] c1 n
2 do keyA[j] c2 n-1
3 ij-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 ii-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 j2 to length[A] c1 n
2 do keyA[j] c2 n-1
3 ij-1 c3 n-1
4 while i >0 and A[i] > key c4
n
j 2 j
t
5 do A[i+1]A[i] c5 n
(t j 1)
j 2

6 ii-1 c6
n
j 2
(t j 1)
7 A[i+1]key c7 n-1

T(n)=???
Algoritmos en la computación

Instrucción Costo Veces que se repite


1 for j2 to length[A] c1 n
2 do keyA[j] c2 n-1
3 ij-1 c3 n-1
4 while i >0 and A[i] > key c4
n
j 2 j
t
5 do A[i+1]A[i] c5 n
(t j 1)
j 2

6 ii-1 c6
n
j 2
(t j 1)
7 A[i+1]key c7 n-1

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


Algoritmos en la computación

2 3 10 16 19 INSERTION-SORT(A)
1 for j2 to length[A]
2 do keyA[j]
j=2
t2=?
3 ij-1
4 while i >0 and A[i] > key
5 do A[i+1]A[i]
6 ii-1
7 A[i+1]key
Algoritmos en la computación

2 3 10 16 19 INSERTION-SORT(A)
1 for j2 to length[A]
2 do keyA[j]
j=3
t3=?
3 ij-1
4 while i >0 and A[i] > key
5 do A[i+1]A[i]
6 ii-1
7 A[i+1]key
Algoritmos en la computación

Instrucción Costo Veces que se repite


1 for j2 to length[A] c1 n
2 do keyA[j] c2 n-1
3 ij-1 c3 n-1
4 while i >0 and A[i] > key c4
n
j 2 j
t
5 do A[i+1]A[i] c5 n
(t j 1)
j 2

6 ii-1 c6
n
j 2
(t j 1)
7 A[i+1]key c7 n-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 j2 to length[A] c1 n
2 do keyA[j] c2 n-1
3 ij-1 c3 n-1
4 while i >0 and A[i] > key c4
n
j 2
1
5 do A[i+1]A[i] c5 0
6 ii-1 c6 0
7 A[i+1]key c7 n-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 j2 to length[A] c1 n
2 do keyA[j] c2 n-1
3 ij-1 c3 n-1
4 while i >0 and A[i] > key c4
n
j 2 j
t
5 do A[i+1]A[i] c5 n
(t j 1)
j 2

6 ii-1 c6
n
j 2
(t j 1)
7 A[i+1]key c7 n-1

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


Algoritmos en la computación

3 2 1 6 9 INSERTION-SORT(A)
1 for j2 to length[A]
2 do keyA[j]
j=2
t2=?
3 ij-1
4 while i >0 and A[i] > key
5 do A[i+1]A[i]
6 ii-1
7 A[i+1]key
Algoritmos en la computación

3 2 1 6 9 INSERTION-SORT(A)
1 for j2 to length[A]

i=1 2 do keyA[j]
j=2
t2=?
3 ij-1
4 while i >0 and A[i] > key
5 do A[i+1]A[i]
6 ii-1
7 A[i+1]key
Algoritmos en la computación

2 3 1 6 9 INSERTION-SORT(A)
1 for j2 to length[A]

i=0 2 do keyA[j]
j=2
t2=?
3 ij-1
4 while i >0 and A[i] > key
5 do A[i+1]A[i]
6 ii-1
7 A[i+1]key
Algoritmos en la computación

2 3 1 6 9 INSERTION-SORT(A)
1 for j2 to length[A]

j=3 2 do keyA[j]
t3=? 3 ij-1
4 while i >0 and A[i] > key
5 do A[i+1]A[i]
6 ii-1
7 A[i+1]key
Algoritmos en la computación

Instrucción Costo Veces que se repite


1 for j2 to length[A] c1 n
2 do keyA[j] c2 n-1
3 ij-1 c3 n-1
4 while i >0 and A[i] > key c4
n
j 2
j
5 do A[i+1]A[i] c5 n
( j 1)
j 2

6 ii-1 c6
n
j 2
( j 1)
7 A[i+1]key c7 n-1

En el peor de los casos, tj=j.


T(n)=???
Algoritmos en la computación

Instrucción Costo Veces que se repite


1 for j2 to length[A] c1 n
2 do keyA[j] c2 n-1
3 ij-1 c3 n-1
4 while i >0 and A[i] > key c4
n
j 2
j/2
n
5 do A[i+1]A[i] c5 j 2
( j / 2 1)
6 ii-1 c6
n
j 2
( j / 2 1)
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)=???
Algoritmos en la computación
Calcule el tiempo de computo para el algoritmo
def programa1(mat1, mat2) # suponga que len(mat1)=len(mat2)=n

Instrucción Costo
1 i=1 c1
2 while i<=len(mat1) c2
3 j1 c3
4 while j<=len(mat2) c4
5 mat3[i][j]mat1[i][j]+mat2[i][j] c5
6 jj+1 c6
7 ii+1 c7
Algoritmos en la computación
Calcule el tiempo de Instrucción Costo
computo para el
algoritmo
1 s0 c1

def programa2(n)
2 i1 c2
3 while i<=n c3
4 t0 c4
5 j1 c5
6 while j<=i c6
7 tt+1 c7
8 jj+1 c8

9 ss+t c9

10 ii+1 c10
Algoritmos en la computación
Calcule el tiempo de Instrucción Costo
computo para el
algoritmo
1 i1 c1

def programa3(n)
2 while i<=n c2
3 ki c3
4 while k<=n c4
5 k k+1 c5
6 k1 c6
7 while k<=i c7
8 kk+1 c8

9 ii+1 c9
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 Dividir

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
Algoritmos en la computación

Merge Sort
Combinar

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
Algoritmos en la computación

Merge sort
Entrada: <a1, a2, …, an>

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


•Conquistar: a’1 a’2 … a’q y a’q+1 a’q+2 … a’n
•Combinar: si a’1 a’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

Ordenar un arreglo de 106 números

Tiempo 1(Insertion) Tiempo 2(Merge)


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

También podría gustarte