You are on page 1of 7

4.

2 Ejemplos de algoritmos
8.

Escriba un algoritmo cuya salida sea el valor menor y mayor en la


sucesin s1, . . . , sn.

9. Escriba un algoritmo que regrese el ndice de la primera ocurrencia del elemento ms grande en la sucesin s, . . . , sn. Ejemplo: Si
la sucesin es

149

la sucesin invertida es
ELIE BRUNO AMY.
15. Escriba un mtodo estndar para sumar dos enteros decimales positivos, que se ensea en primaria, como un algoritmo.
16. Escriba un algoritmo que recibe como entrada la matriz A de n n
y produce la transpuesta AT.

6.2 8.9 4.2 8.9,


el algoritmo regresa el valor 2.
10. Escriba un algoritmo que regrese el ndice de la ltima ocurrencia
del elemento ms grande en la sucesin s1, . . . , sn. Ejemplo: Si la
sucesin es

17. Escriba un algoritmo que recibe como entrada la matriz de una relacin R y prueba si R es reflexiva.
18. Escriba un algoritmo que recibe como entrada la matriz de una relacin R y prueba si R es simtrica.
19. Escriba un algoritmo que recibe como entrada la matriz de una relacin R y prueba si R es transitiva.

6.2 8.9 4.2 8.9,


el algoritmo regresa el valor 4.
11. Escriba un algoritmo que produzca la suma de la sucesin de nmeros s1, . . . , sn.
12. Escriba un algoritmo que regrese el ndice del primer elemento
que es menor que su predecesor en la sucesin s1, . . . , sn. Si s est en orden no decreciente, el algoritmo regresa el valor 0. Ejemplo: Si la sucesin es
AMY BRUNO ELIE DAN ZEKE,
el algoritmo proporciona el valor 4.
13. Escriba un algoritmo que regrese el ndice del primer elemento
que es mayor que su predecesor en la sucesin s1, . . . , sn. Si s est en orden no decreciente, el algoritmo regresa el valor 0. Ejemplo: Si la sucesin es
AMY BRUNO ELIE DAN ZEKE,
el algoritmo regresa el valor 2.

20. Escriba un algoritmo que recibe como entrada la matriz de una relacin R y prueba si R es antisimtrica.
21. Escriba un algoritmo que recibe como entrada la matriz de una relacin R y prueba si R es una funcin.
22. Escriba un algoritmo que recibe como entrada la matriz de una relacin R y produce como salida la matriz de la relacin inversa R 1.
23. Escriba un algoritmo que recibe como entrada las matrices de las
relaciones R1 y R2 y produce como salida la matriz de la composicin R1 # R2.

24. Escriba un algoritmo cuya entrada sea una sucesin s1, . . . , sn y


un valor x. (Suponga que todos los valores son nmeros reales.) El
algoritmo regresa verdadero si si + sj = x, para alguna i ! j, y falso de otra manera. Ejemplo: Si la sucesin de entrada es
2, 12, 6, 14
y x = 26, el algoritmo regresa verdadero porque 12 + 14 = 26. Si
la sucesin de entrada es

14. Escriba un algoritmo que invierta la sucesin s1, . . . , sn. Ejemplo:


Si la sucesin es
AMY BRUNO ELIE,

2, 12, 6, 14
y x = 4, el algoritmo regresa falso porque ningn par de trminos
distintos en la sucesin suma 4.

4.2 Ejemplos de algoritmos


Los algoritmos se concibieron para resolver muchos problemas. En esta seccin se dan
ejemplos de varios algoritmos tiles. En el resto del libro, se investigarn muchos otros algoritmos.
Bsqueda
Las computadoras destinan una gran cantidad de tiempo a buscar. Cuando un cajero busca
un registro en un banco, un programa de computadora realiza la bsqueda. Tratar de encontrar una solucin a un crucigrama o un movimiento ptimo en un juego se puede establecer como un problema de bsqueda. Usar una mquina de bsqueda en Internet es otro
ejemplo de un problema de bsqueda. Encontrar un texto especfico en un documento al
correr un procesador de textos es otro ejemplo de un problema de bsqueda. Se analizar
un algoritmo para resolver el problema de buscar un texto.
Suponga que se da el texto t (por ejemplo, un documento en un procesador de palabras) y queremos encontrar la primera ocurrencia del patrn p en t (por ejemplo, se desea
encontrar la primera ocurrencia de la cadena p = Nueva Escocia en t) o determinar que
p no aparece en t. Se indexan los caracteres en t comenzando con 1. Un enfoque para buscar p es verificar si p ocurre en el ndice 1 en t. Si as es, nos detenemos, puesto que ya se

Captulo 4 Algoritmos
encontr la primera ocurrencia de p en t. Si no, se verifica si p ocurre en el ndice 2 en t. Si
as es, nos detenemos, pues ya se encontr la primera ocurrencia de p en t. Si no, se verifica el ndice 3 en t, y as sucesivamente.
El algoritmo de bsqueda de texto se establece como el algoritmo 4.2.1.

Algoritmo 4.2.1

Bsqueda de texto
Este algoritmo busca una ocurrencia del patrn p en el texto t. Regresa el ndice ms pequeo i tal que p ocurre en t comenzando en el ndice i. Si p no ocurre en t, regresa 0.
Entrada: p (indexada de 1 a m), m, t (indexada de 1 a n), n
Salida: i
busca_texto(p, m, t, n){
for i = 1 to n m + 1{
j=1
// i es el ndice en t del primer carcter de la
// subcadena para comparar con p, y j es el ndice
// en p
// el ciclo while compara ti . . . ti+m1 y p1 . . . pm
while (ti+j1 == pj){
j=j+1
if(j > m)
return i
}
}
return 0
}

La variable i marca el ndice en t del primer carcter de la subcadena para compararlo con p. El algoritmo primero intenta i = 1, despus i = 2, y as sucesivamente. El ndice
n m + 1 es el ltimo valor posible para i ya que, en este punto, la cadena
tnm+1 tnm+2 tm tiene la longitud exacta m.
Despus de establecer el valor i, el ciclo while compara ti . . . ti+m1 y p1 . . . pm. Si
los caracteres coinciden,
ti+ j1 == p j

j se incrementa
j=j+1
y se comparan los siguientes caracteres. Si j es m + 1, todos los m caracteres coinciden y
hemos encontrado p en el ndice i en t. En este caso, el algoritmo regresa i:
if (j > m)
return i
Si el ciclo corri hasta completarse, nunca se encontr una coincidencia, en cuyo caso el
algoritmo regresa 0.

Ejemplo 4.2.2

150

La figura 4.2.1 muestra un rastreo del algoritmo 4.2.1 donde se busca el patrn 001 en el
texto 010001.

Orden
Ordenar (sort) una sucesin significa ponerla en algn orden especfico. Si se tiene una
sucesin de nombres, tal vez se desee ordenarla en orden no decreciente de acuerdo con el
diccionario.

4.2 Ejemplos de algoritmos


j =1

001
010001

i =1

(1)

j =2

001
010001

i =3
(4)

j =1

001
010001

i =4
(7)

j =2
()
001
010001

i =1

(2)
j =2

001
010001

i =3
(5)

j =2

001
010001

i =4
(8)

151

j =1
()
001
010001

i =2

(3)
j =3
()

001
010001

i =3
(6)

j =3

001
010001

i =4
(9)

Figura 4.2.1 Bsqueda de 001 en 010001 usando el algoritmo 4.2.1.


La cruz () en los pasos (2), (3) y (6) marcan una diferencia.
Por ejemplo, si la sucesin es
Jones, Johnson, Appel, Zamora, Chu,
despus de ordenar la sucesin en orden no decreciente, se obtendra
Appel, Chu, Johnson, Jones, Zamora.
Una ventaja importante al usar una sucesin ordenada en lugar de una sin ordenar es que
es mucho ms sencillo encontrar un elemento especfico. Imagine intentar encontrar el nmero del telfono de un individuo en particular en el directorio de la ciudad de Nueva York
si los nombres no estuvieran en orden!
Se han diseado muchos algoritmos para ordenar (vea [Knuth, 1998b]). Decidir qu
algoritmo es preferible en una situacin especfica depende de factores como el tamao de
los datos y cmo estn representados. Analicemos la insercin por orden (insertion sort),
que es uno de los algoritmos ms rpidos para ordenar sucesiones pequeas (alrededor de
50 elementos).
Se supone que la entrada a insercin por orden es
s1 , . . . , sn
y la meta es colocar los datos en orden no decreciente. En la i-sima iteracin de la insercin por orden, la primera parte de la sucesin
s1, . . . , si
se habr rearreglado de manera que est ordenada. (En breve se explicar cmo se ordena
s1, . . . , si). Despus la insercin por orden inserta si+1 en
s1, . . . , si

152

Captulo 4 Algoritmos
de manera que
s1, . . . , si, si+1
est ordenada.
Por ejemplo, suponga que i = 4 y s1, . . . , s4 es
8

13

20

27

Si s5 es 16, despus de insertarlo, s1, . . . , s5 se convierte en


8

13

16

20

27

Observe que 20 y 27, al ser mayores que 16, se mueven un ndice a la derecha para que entre 16. As, la parte de insercin del algoritmo es: Comenzando por la derecha de la sucesin ordenada, un elemento se mueve un ndice a la derecha si es mayor que el elemento
que se inserta. Esto se repite hasta llegar al primer ndice o encontrar un elemento menor o
igual que el elemento que se inserta.
Por ejemplo, para insertar 16 en

13

20

27

primero se comparan 16 y 27. Como 27 es mayor que 16, 27 se mueve un ndice a la derecha:
8

13

20

27

Despus se comparan 16 y 20. Como 20 es mayor que 16, 20 se mueve un ndice a la derecha:
8

13

20

27

Ahora se comparan 16 y 13. Como 13 es menor o igual que 16, se inserta (es decir, se copia) 16 al tercer ndice:
8

13

16

20

27

Con esto la subsucesin queda ordenada.


Una vez explicada la idea clave de la insercin por orden, completamos la explicacin del algoritmo. La insercin por orden comienza por insertar s2 en la subsucesin s1.
Observe que s1 por s misma est ordenada. Ahora s1, s2 est ordenada. Luego, la insercin
por orden inserta s3 en la susbsucesin ordenada s1, s2. Ahora s1, s2, s3 est ordenada. Este
procedimiento contina hasta que la insercin por orden inserta sn en la subsucesin ordenada s1, . . . , sn1. Ahora la sucesin completa s1, . . . , sn est ordenada. Se obtiene el siguiente algoritmo.

4.2 Ejemplos de algoritmos


Algoritmo 4.2.3

153

Insercin por orden


Este algoritmo ordena la sucesin s1, . . . , sn en orden no decreciente.
Entrada: s, n
Salida: s (ordenada)
insercin_por_orden(s, n){
for i = 2 to n {
val = si //guarda si para insertarla en el lugar correcto
j=i1
// si val < sj, se mueve sj a la derecha para dejar lugar a si
while (j 1 val < sj){
sj+1 = sj
j=j1
}
sj+1 = val // inserta val
}
}
Se deja la prueba de que el algoritmo 4.2.3 es correcto como ejercicio (vea el ejercicio 12).
Tiempo y espacio para los algoritmos
Es importante saber o poder estimar el tiempo (por ejemplo, el nmero de pasos) y el espacio (como nmero de variables, longitud de las sucesiones) requeridos por los algoritmos. Conocer el tiempo y el espacio que requiere un algoritmo permite comparar
algoritmos que resuelven el mismo problema. Por ejemplo, si un algoritmo toma n pasos
para resolver un problema y otro toma n2 pasos para hacer lo mismo, sin duda ser preferible el primero, suponiendo que los requerimientos de espacio son aceptables. En la seccin 4.3 se dan las definiciones tcnicas que permiten hacer afirmaciones rigurosas acerca
del tiempo y espacio requeridos por los algoritmos.
El ciclo for en el algoritmo 4.2.3 siempre se ejecuta n 1 veces, pero el nmero
de veces que se ejecuta el ciclo while para un valor especfico de i depende de los datos
de entrada. As, aun para un tamao fijo n, el tiempo requerido por el algoritmo 4.2.3 depende de la entrada. Por ejemplo, si la sucesin de entrada ya est ordenada en orden no
decreciente,
val < sj
ser falso siempre, y el cuerpo del ciclo while nunca se ejecutar. Esto se llama tiempo del
mejor caso (best-case time).
Por otro lado, si la sucesin est ordenada en orden decreciente,
val < sj
ser verdadera siempre, y el ciclo while se ejecutar el nmero mximo de veces. (El ciclo
while se ejecutar i 1 veces durante la i-sima iteracin del ciclo). Esto se llama tiempo
del peor caso (worst-case time).
Algoritmos aleatorizados
En ocasiones es necesario relajar los requerimientos para los algoritmos establecidos en la
seccin 4.1. Muchos de los algoritmos que se usan en la actualidad no son generales, determinsticos o ni siquiera finitos. Un sistema operativo (como Windows XP), por ejemplo,
es mejor pensarlo como un programa que nunca termina en lugar de como un programa finito con entrada y salida. Los algoritmos escritos para ms de un procesador, ya sea una
mquina con multiprocesador o un entorno distribuido (como Internet), rara vez son determinsticos. Adems, muchos problemas prcticos son demasiado difciles para resolverlos

Captulo 4 Algoritmos
con eficiencia y comprometen la generalidad o la correccin necesaria. Como ilustracin,
se presenta un ejemplo que muestra la utilidad de permitir que un algoritmo tome decisiones aleatorias, violando el requerimiento de determinismo.
Un algoritmo aleatorizado no requiere que los resultados intermedios de cada paso
de la ejecucin estn definidos de manera nica y dependan slo de las entradas y los resultados de los pasos anteriores. Por definicin, cuando un algoritmo aleatorizado se ejecuta, en algn punto hace una eleccin aleatoria. En la prctica, se usa un generador de
nmeros seudoaleatorios (vea el ejemplo 2.2.15).
Debe suponerse la existencia de una funcin
rand(i, j),
que regresa un entero aleatorio entre los enteros i y j, inclusive. Como ejemplo, se describe un algoritmo aleatorizado que desordena una sucesin de nmeros. De manera ms precisa, la entrada es la sucesin a1, . . . , an y mueve los nmeros a posiciones aleatorias. Los
grandes torneos de bridge usan programas de computadora para barajar las cartas.
El algoritmo primero intercambia (es decir, cambia los valores de) a1 y arand(1,n). En
este punto, el valor de a1 puede ser igual a cualquiera de los valores originales de la sucesin. Despus, el algoritmo intercambia a2 y arand(2,n). Ahora el valor de a2 puede ser igual
a cualquiera de los valores restantes de la sucesin. El algoritmo contina hasta que intercambia an1 y arand(n 1,n) y la sucesin completa est desordenada.

Algoritmo 4.2.4

Desordenar (shuffle)
Este algoritmo desordena los valores de una sucesin
a1, . . . , an.
Entrada: a, n
Salida: a (desordenada)
desordena(a, n){
for i = 1 to n 1
swap(ai, arand(i,n))
}

Ejemplo 4.2.5

154

Suponga que la sucesin a


17

23

21

es la entrada que se va a desordenar. Primero se cambian ai y aj, donde i = 1 y j =


rand(1, 5). Si j = 3, despus del intercambio (swap) se tiene
5

17

23

21

Luego, i = 2. Si j = rand(2, 5) = 5, despus del intercambio se tiene


5

21

17

23

Ahora i = 3. Si j = rand(3, 5) = 3, la sucesin no cambia.


Por ltimo, i = 4. Si j = rand(4, 5) = 5, despus del intercambio se tiene
5

21

17

23

4.2 Ejemplos de algoritmos

155

Observe que la salida (es decir, la sucesin desordenada) depende de las elecciones
aleatorias que hace el generador de nmeros aleatorios.

Sugerencias para resolver problemas


De nuevo, se hace hincapi en que, al construir un algoritmo, con frecuencia es til suponer que uno est a la mitad del algoritmo y que esa parte del problema est resuelta. En la
insercin por orden (algoritmo 4.2.3) fue til suponer que las subsucesin s1, . . . , si estaba ordenada. Entonces, todo lo que haba que hacer era insertar el siguiente elemento si+1
en el lugar adecuado. Al iterar dicho procedimiento se obtiene el algoritmo. Tales observaciones llevan a un ciclo invariante que sirve para probar que el algoritmo 4.2.3 es correcto
(vea el ejercicio 12).

Seccin de ejercicios de repaso


2. Qu es bsqueda de texto?

8. Por qu es til conocer o poder estimar el tiempo y el espacio requeridos por un algoritmo?

3. Describa en palabras un algoritmo que resuelva el problema de


bsqueda de texto.

9. Por qu a veces es necesario relajar los requerimientos establecidos en la seccin 4.1 para un algoritmo?

1. Proporcione ejemplos de problemas de bsqueda.

4. Qu significa ordenar una sucesin?

10. Qu es un algoritmo aleatorizado?

5. D un ejemplo que ilustre por qu es deseable ordenar una sucesin.

11. Cules de los requerimientos de un algoritmo, segn se estableci en la seccin 4.1, viola un algoritmo aleatorizado?

6. Describa la insercin por orden en palabras.

12. Describa en palabras el algoritmo para desordenar.

7. Qu quiere decir tiempo y espacio requeridos por un algoritmo?

13. D una aplicacin del algoritmo para desordenar.

Ejercicios
1. Haga un seguimiento del algoritmo 4.2.1 para la entrada t = balalaika y p = bala.
2. Haga un seguimiento del algoritmo 4.2.1 para la entrada t = balalaika y p = lai.

3. Haga un seguimiento del algoritmo 4.2.1 para la entrada


t = 000000000 y p = 001.
4. Haga el seguimiento del algoritmo 4.2.3 para la entrada

5. Haga el seguimiento del algoritmo 4.2.3 para la entrada


34 20 19 5.

34 55 144 259.
7. Haga el seguimiento del algoritmo 4.2.3 para la entrada
34 34 34 34.

34 57 72 101 135.

rand(1, 5) = 5,

rand(3, 5) = 4,

rand(2, 5) = 5,

rand(4, 5) = 4.

12. Pruebe que el algoritmo 4.2.3 es correcto.


13. Escriba un algoritmo que regrese el ndice de la primera ocurrencia del valor clave de la sucesin s1, . . . , sn. Si la clave no est
en la sucesin, el algoritmo regresa el valor 0. Ejemplo: Si la sucesin es
12 11 12 23

8. Haga el seguimiento del algoritmo 4.2.4 para la entrada


34 57 72 101 135.
Suponga que los valores de rand son
rand(2, 5) = 4,

rand(4, 5) = 5.

9. Haga el seguimiento del algoritmo 4.2.4 para la entrada


34 57 72 101 135.

rand(2, 5) = 5,

rand(4, 5) = 4.

10. Haga el seguimiento del algoritmo 4.2.4 para la entrada

11. Pruebe que el algoritmo 4.2.1 es correcto.

6. Haga el seguimiento del algoritmo 4.2.3 para la entrada

rand(3, 5) = 3,

rand(1, 5) = 2,

rand(3, 5) = 3,

Suponga que los valores de rand son

34 20 144 55.

rand(1, 5) = 5,

Suponga que los valores de rand son

y la clave es 12, el algoritmo regresa el valor 1.


14. Escriba un algoritmo que regrese el ndice de la ltima ocurrencia del valor clave en la sucesin s1, . . . , sn. Si la clave no est
en la sucesin, el algoritmo regresa el valor 0. Ejemplo: Si la sucesin es
12 11 12 23
y la clave es 12, el algoritmo regresa el valor 3.

You might also like