Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Cap6 Algoritmos cc101
Cap6 Algoritmos cc101
Facultad de Ciencias
Introduccin a la Ciencia de la
Computacin
Algoritmos
Prof: J. Solano
2011-I
Objetivos
Despus de estudiar este captulo el estudiante sera capaz de:
Definir un algoritmo y relacionarlo a la resolucin de
problemas.
Definir tres construictores y describir su uso en algoritmos.
Describir los diagramas UML y pseudocdigo y cmo se usan
en los algoritmos.
Listar algoritmos bsicos y sus aplicaciones.
Describir el concepto de ordenacin y entender los
mecanismos detrs de tres algoritmos de ordenacin primitiva.
Describir el concepto de bsqueda y entender los
mecanismos detrs de dos algoritmos de bsqueda comunes.
Definir subalgoritmos y sus relaciones con los algoritmos.
Distinguir entre los algoritmos iterativos y recursivos.
Introduccion a la Ciencia de la Computacion - CC101
Historia
Algos es la palabra griega para el dolor. Algor en latin, significa
fro.
Ninguno es la raz de algoritmo, que en su lugar tiene su origen
de Al-Khwarizmi, erudito rabe del siglo nueve, cuyo libro
al-jabr wa'l muqabalah derivo en los libros de texto de lgebra
de hoy en las escuelas secundaria.
Al-Khwarizmi hizo hincapi en la importancia de procedimientos
metdicos para la solucin de problemas.
Si estuviera presente hoy, sin duda estara impresionado por los
avances en su enfoque del mismo nombre.
CONCEPTO
Aqui se define de manera informal un algoritmo y se
desarrolla el concepto con un ejemplo.
Definicin informal
Una definicin informal de un algoritmo es:
Algoritmo: un mtodo paso-a-paso para resolver un
problema o hacer una tarea.
Ejemplo
Queremos desarrollar un algoritmo para encontrar el mayor
entero entre una lista de nmeros enteros positivos. El algoritmo
debe encontrar el mayor entero entre una lista de valores (por
ejemplo 5, 1000, 10000, 1000000). El algoritmo debe ser
general y no depende del nmero de enteros.
Para resolver este problema, necesitamos un enfoque intuitivo.
En primer lugar utilizar un pequeo nmero de enteros (por
ejemplo, cinco), a continuacin, extender la solucin a cualquier
nmero de enteros.
La siguiente figura muestra una manera de resolver este
problema. Llamamos al algoritmo FindLargest. Cada algoritmo
tiene un nombre para distinguirlo de otros algoritmos. El
algoritmo recibe una lista de cinco nmeros enteros como
entrada y da el mayor entero como salida.
Introduccion a la Ciencia de la Computacion - CC101
10
Definiendo acciones
11
Refinamiento
Este algoritmo debe refinarse para ser aceptable para la
comunidad de programadores. Hay dos problemas. En primer
lugar, la accin en el primer paso es diferente a las de los otros
pasos. En segundo lugar, la redaccin no es la misma en los
pasos 2 a 5. Fcilmente podemos redefinir el algoritmo para
eliminar estos dos inconvenientes al cambiar la redaccin en los
pasos 2 a 5 "Si el entero actual es mayor que el ms grande,
llamar de mayor a el entero actual". La razn por la que el
primer paso es diferente a los otros pasos se debe a que el
Mayor no se ha inicializado. Si inicializamos mayor a -
(menos infinito), entonces el primer paso puede ser el mismo
que los otros pasos, por lo que aadimos un nuevo paso,
llamndolo el paso 0 para indicar que se debe hacer antes de
procesar cualquier enteros.
Introduccion a la Ciencia de la Computacion - CC101
12
FindLargest refinado
Introduccion a la Ciencia de la Computacion - CC101
13
Generalizacin
Es posible generalizar el algoritmo? Queremos encontrar el
mayor de n enteros positivos, donde n puede ser 1000,
1.000.000, o ms. Por supuesto, podemos seguir la figura
anterior y repetir cada paso. Pero si cambiamos el algoritmo a
un programa, entonces tenemos que escribir las acciones para
los n pasos!
Hay una forma mejor de hacer esto. Podemos decirle a la
computadora para repetir los pasos n veces.
A continuacin se incluye esta funcin en nuestro algoritmo
pictrica.
14
Generalizacin de FindLargest
Introduccion a la Ciencia de la Computacion - CC101
15
TRES CONSTRUCTORES
Los cientficos en computacin han definido tres
constructores para un programa estructurado o algoritmo. La
idea es que un programa debe estar hecho de una combinacin
de slo estos tres constructores: secuencia, decisin (seleccin)
y repeticin (figura siguiente). Se ha demostrado que no hay
necesidad de otros constructores. Utilizando slo estos
constructores hace que un programa o un algoritmo sea fcil de
entender, depurar o cambiar.
16
Tres constructores
Introduccion a la Ciencia de la Computacion - CC101
17
Secuencia
El primer constructor se llama secuencia. Un algoritmo, y,
eventualmente un programa, es una secuencia de instrucciones,
que pueden ser una simple instruccin o cualquiera de los otros
dos constructores.
Decisin
Algunos problemas no pueden resolverse slo con una
secuencia de instrucciones simples. A veces tenemos que probar
una condicin. Si el resultado de las pruebas es verdadeo,
seguimos una secuencia de instrucciones: si es falso, seguimos
una secuencia diferente de instrucciones. Esto se conoce como
el constructor decisin (seleccin).
Introduccion a la Ciencia de la Computacion - CC101
18
Repeticin
En algunos problemas, la misma secuencia de instrucciones que
debe repetirse. Nosotros nos encargamos de esto con el
constructor repeticin o bucle (loop). Encontrar el nmero
entero ms grande entre un conjunto de nmeros enteros puede
utilizar una constructor de este tipo.
19
REPRESENTACIN DE ALGORITMOS
Hasta ahora, hemos utilizado figuras para transmitir el concepto
de un algoritmo. Durante las ltimas dcadas, se han diseado
diferentes herramientas para este propsito. Dos de estas
herramientas, UML y pseudocdigo, se presentan aqu.
20
UML
Unified Modeling Language (UML) es una representacin
pictrica de un algoritmo. Oculta todos los detalles de un
algoritmo en un intento de dar el "cuadro grande " y mostrar
cmo el algoritmo fluye de principio a fin. Hay mucha
biblografa sobre UML. Aqu slo mostramos cmo los tres
constructores son representados usando UML.
21
22
Pseudocdigo
Pseudocdigo es una representacin como-idioma-Ingls de un
algoritmo. No hay un estndar para pseudocdigo, algunas
personas utilizan una gran cantidad de detalles, otros utilizan
menos. Algunos utilizan un cdigo que se encuentra cerca del
Ingls, mientras que otros utilizan una sintaxis como el lenguaje
de programacin Pascal.
Aqu se muestra slo cmo los tres constructores pueden ser
representados por pseudocdigo.
23
24
Ejemplo 1
Escribir un algoritmo en pseudocdigo que halle la suma de dos
enteros.
25
Ejemplo 2
Escribir un algoritmo para cambiar una nota numrica a pas/no pas
(pass/no pass).
26
Ejemplo 3
Escribir un algoritmo para cambiar una nota numrica (entero) a nota
de letra.
27
Ejemplo 4
28
Ejemplo 5
29
Algoritmo:
Un conjunto ordenado de pasos sin ambigedades
que produce un resultado y termina en un tiempo
finito.
30
Conjunto ordenado
Un algoritmo debe ser un conjunto ordenado, y bien definido,
de instrucciones.
Pasos no ambiguos
Cada paso en un algoritmo debe ser claro y sin ambigedades.
Si un paso es sumar dos nmeros enteros, debemos definir
ambos "enteros", as como la operacin "add" (sumar): no
podemos, por ejemplo, usar el mismo smbolo para representar
adicin en un lugar y multiplicacin en otro lugar.
31
Produce un resultado
Un algoritmo debe producir un resultado, de lo contrario es
intil. El resultado puede ser datos entregados al algoritmo de
llamada, o algn otro efecto (por ejemplo, la impresin).
32
ALGORITMOS BSICOS
Varios algoritmos que se utilizan prevalentemente en informtica
se consideran "bsicos". Discutiremos los ms comunes. Esta
discusin es muy general: la implementacin depende del
lenguaje.
33
Adicin (resumen)
Un algoritmo de uso general en ciencia de la computacin es la
adicin. Podemos sumar dos o tres nmeros enteros muy
fcilmente, pero cmo podemos sumar muchos enteros? La
solucin es simple: utilizar el operador de aadir (add) en un
bucle.
Un algoritmo de adicin tiene tres partes lgicas:
1. Inicializacin de la suma al principio.
2. El bucle, que en cada iteracin aade un nuevo entero
a la suma.
3. Retorno del resultado despus de salir del bucle.
34
Algoritmo de adicin
dici
Introduccion a la Ciencia de la Computacion - CC101
35
Producto
Otro algoritmo comn es encontrar el producto de una lista de
nmeros enteros. La solucin es simple: utilizar el operador de
multiplicacin en un bucle.
36
Algoritmo de producto
Introduccion a la Ciencia de la Computacion - CC101
37
El menor y el mayor
Hemos discutido el algoritmo para encontrar el mayor entre una
lista de enteros en el comienzo de este captulo. La idea era
escribir un constructor decisin para encontrar el mayor de dos
nmeros enteros. Si ponemos este constructor en un bucle,
podemos encontrar el mayor de una lista de nmeros enteros.
Encontrar el menor entero entre una lista de nmeros enteros es
similar, con dos pequeas diferencias. En primer lugar, utilizamos
un consturctor decisin para encontrar el menor de dos nmeros
enteros. En segundo lugar, inicializar con un entero muy grande
en lugar de uno muy pequeo.
38
Algoritmos de ordenacin
Una de las aplicaciones ms comunes en ciencia de la
computacin es la ordenacin, que es el proceso mediante el cual
los datos se organizan de acuerdo a sus valores. La gente est
rodeada de datos. Si los datos no estuvieran ordenados, se tardara
horas y horas para encontrar una sola pieza de informacin.
Imagine la dificultad de encontrar el nmero de telfono de
alguien en un directorio telefnico que no esta ordenado.
En esta seccin, presentamos tres algoritmos de ordenacin:
ordenamiento de seleccin, ordenamiento de burbuja y la
ordenacin por insercin. Estos tres algoritmos de ordenacin
son la base de los algoritmos de ordenacin ms rpidos
utilizados en la informtica de hoy.
Introduccion a la Ciencia de la Computacion - CC101
39
Ordenamiento de seleccin
En un ordenamiento de seleccin, la lista a ser ordenada se divide
en dos sublistas, clasificados y no clasificados, que estn
separadas por una pared imaginaria. Encontramos el elemento
ms pequeo en la lista secundaria sin clasificar y lo
intercambiamos con el elemento al principio de la lista secundaria
sin clasificar. Despus de cada seleccin e intercambio, la pared
imaginaria entre los dos sublistas se mueve un elemento para
delante.
Ordenamiento de seleccin
Introduccion a la Ciencia de la Computacion - CC101
40
41
42
Ordenamiento de burbuja
En el mtodo de ordenamiento de burbuja, la lista a ser ordenada
tambin se divide en dos sublistas, clasificados y sin clasificar. El
elemento ms pequeo se burbujea desde la lista secundaria sin
clasificar y se traslada a la sublista ordenada. Despus de que el
elemento ms pequeo ha sido trasladado a la lista ordenada, la
pared se mueve un elemento por delante.
Ordenamiento de burbuja
Introduccion a la Ciencia de la Computacion - CC101
43
44
45
46
47
Ejemplo de ordenamiento
rapido (Quicksort)
48
Bsqueda
Otro algoritmo comn en ciencias de la computacin est
buscando, que es el proceso de encontrar la ubicacin de un
objetivo de entre una lista de objetos. En el caso de una lista,
buscando los medios que le da un valor, queremos encontrar la
ubicacin del primer elemento de la lista que contiene ese valor.
Hay dos registros de base para las listas: la bsqueda secuencial
y bsqueda binaria.
binaria Bsqueda secuencial puede ser utilizado
para localizar un elemento en cualquier lista, mientras que la
bsqueda binaria requiere que la este primero ordenada.
49
Bsqueda secuencial
Bsqueda secuencial se utiliza si la lista en la que se debe buscar
no esta ordenada. En general, utilizamos esta tcnica slo para
pequeas listas o listas en las que no se busca a menudo. En otros
casos, lo mejor es primero ordenar la lista y, a continuacin
buscar usando la bsqueda binaria discutida antes.
En una bsqueda secuencial, se empieza buscando el objetivo
desde el principio de la lista. Continuamos hasta que encontremos
el objetivo o alcanzemos el fin de la lista.
50
51
Bsqueda binaria
El algoritmo de bsqueda secuencial es muy lento. Si tenemos
una lista de un milln de elementos, tenemos que hacer un milln
de comparaciones en el peor de los casos. Si la lista no est
ordenada, esta es la nica solucin. Si la lista est ordenada, sin
embargo, podemos usar un algoritmo ms eficiente llamada
bsqueda binaria. En general, los programadores utilizan una
bsqueda binaria cuando la lista es grande.
Una bsqueda binaria comienza probando los datos en el
elemento en la mitad de la lista. Esto determina si el objetivo est
en la primera mitad o la segunda mitad de la lista. Si est en la
primera mitad, no hay necesidad de controlar ms el segundo
segmento. Si est en la segunda mitad, no hay necesidad de
controlar ms el primer segmento. En otras palabras, eliminamos
la mitad de la lista de cualquier consideracin posterior.
Introduccion a la Ciencia de la Computacion - CC101
52
53
SUBALGORITMOS
Los tres constructores de programacin descritos anteriormente
nos permite crear un algoritmo para cualquier problema soluble.
Los principios de la programacin estructurada, sin embargo,
requieren que un algoritmo se divida en pequeas unidades
llamadas subalgorithms. Cada subalgoritmo a su vez se divide en
pequeos subalgoritmos. Un buen ejemplo es el algoritmo para
ordenamiento por seleccin en la siguiente figura.
54
Concepto de subalgoritmo
Introduccion a la Ciencia de la Computacion - CC101
55
56
RECURSIVIDAD
57
Definicin iterativa
Para estudiar un ejemplo sencillo, consideremos el clculo de un
factorial. El factorial de un entero es el producto de los valores
enteros entre 1 y el entero. La definicin es iterativa. Un
algoritmo es iterativo cada vez que la definicin no implica el
propio algoritmo.
58
Definicin recursiva
Un algoritmo se define de forma recursiva cada vez que el
algoritmo aparece dentro de la propia definicin. Por ejemplo, la
funcin factorial se puede definir de forma recursiva, como se
muestra en la Figura.
59
60
Solucin iterativa
61
Solucin recursiva
La solucin no necesita un bucle, ya que el concepto de
recursividad envuelve repeticin.
62
f(1) = 0
f(2) = 1
f(n)=f(n-1)+f(n-2)
63
long fibo(int n)
{ si(n<= 2) retornar n-1;
a = 0, b = 1, c, i;
para( i = 3; i < n ; i++ )
{
c = a + b;
a = b; b = c;
}
retornar c;
}
f(1) = 0
f(2) = 1
f(n)=f(n-1)+f(n-2)
64
f(1) = 0
f(2) = 1
f(n)=f(n-1)+f(n-2)
long f(int n)
{ si(n<= 2)
retornar n-1;
retornar f(n-1)+f(n-2);
}
Introduccion a la Ciencia de la Computacion - CC101
65
long fibo(int n)
{ si(n<= 2) retornar n-1;
a = 0, b = 1, c, i;
para( i = 3; i < n ; i++ )
{
c = a + b;
a = b; b = c;
}
retornar c;
}
f(1) = 0
f(2) = 1
f(n)=f(n-1)+f(n-2)
long f(int n)
{ si(n<= 2)
retornar n-1;
retornar f(n-1)+f(n-2);
}
66
49
48
47
47
47
46
46
67
68
69
70