Está en la página 1de 70

Universidad Nacional de Ingeniera

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

Algoritmos para todas las eras


Grandes algoritmos son la poesa de la computacin
Francis Sullivan
Institute for Defense Analyses' Center for Computing Sciences Bowie,
Maryland

Introduccion a la Ciencia de la Computacion - CC101

La importancia de los Algoritmos


Anlisis de tiempo de ejecucin

Introduccion a la Ciencia de la Computacion - CC101

La importancia de los Algoritmos


Ordenamiento O(N2)
Camino mas corto O(CN) Ej: Algoritmo de Djikstra
Algoritmos aproximados
Algoritmos aleatorios O(N2)-O(N*log(N)) Ej: Quicksort y median
Compresin
La importancia de conocer algoritmos
Mas ejemplos del mundo real
Flujo Mximo
Comparacin de secuencias
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.

Introduccion a la Ciencia de la Computacion - CC101

CONCEPTO
Aqui se define de manera informal un algoritmo y se
desarrolla el concepto con un ejemplo.

Introduccion a la Ciencia de la Computacion - CC101

Definicin informal
Una definicin informal de un algoritmo es:
Algoritmo: un mtodo paso-a-paso para resolver un
problema o hacer una tarea.

Introduccion a la Ciencia de la Computacion - CC101

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

Hallar el mayor entero entre cinco enteros


Introduccion a la Ciencia de la Computacion - CC101

10

Definiendo acciones

La figura anterior no muestra que debe hacerse en cada paso.


Podemos modificar la figura para mostrar mas detalles.

Definiendo acciones en algoritmo FindLargest


Introduccion a la Ciencia de la Computacion - CC101

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.

Introduccion a la Ciencia de la Computacion - CC101

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.

Introduccion a la Ciencia de la Computacion - CC101

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.

Introduccion a la Ciencia de la Computacion - CC101

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.

Introduccion a la Ciencia de la Computacion - CC101

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.

Introduccion a la Ciencia de la Computacion - CC101

21

UML para los tres constructores


Introduccion a la Ciencia de la Computacion - CC101

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.

Introduccion a la Ciencia de la Computacion - CC101

23

Pseudocdigo para los tres constructores


Introduccion a la Ciencia de la Computacion - CC101

24

Ejemplo 1
Escribir un algoritmo en pseudocdigo que halle la suma de dos
enteros.

Introduccion a la Ciencia de la Computacion - CC101

25

Ejemplo 2
Escribir un algoritmo para cambiar una nota numrica a pas/no pas
(pass/no pass).

Introduccion a la Ciencia de la Computacion - CC101

26

Ejemplo 3
Escribir un algoritmo para cambiar una nota numrica (entero) a nota
de letra.

Introduccion a la Ciencia de la Computacion - CC101

27

Ejemplo 4

Escribir un algoritmo para hallar el mayor nmero de un conjunto de


enteros. No conocemos el nmero de enteros.

Introduccion a la Ciencia de la Computacion - CC101

28

Ejemplo 5

Escribir un algoritmo para hallar el mayor de los primeros 1000


enteros en un conjunto de enteros.

Introduccion a la Ciencia de la Computacion - CC101

29

UNA DEFINICION MAS FORMAL


Ahora que hemos discutido el concepto de algoritmo y mostrado
su representacin, aqu tenemos una definicin ms formal.

Algoritmo:
Un conjunto ordenado de pasos sin ambigedades
que produce un resultado y termina en un tiempo
finito.

Introduccion a la Ciencia de la Computacion - CC101

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.

Introduccion a la Ciencia de la Computacion - CC101

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).

Termina en un tiempo finito


Un algoritmo debe terminar (halt). Si no es as (es decir, tiene
un bucle infinito), no hemos creado un algoritmo. Existe toda
una area para discutir problemas solubles e insolubles. Veremos
que un problema soluble tiene una solucin en la forma de un
algoritmo que termina.
Introduccion a la Ciencia de la Computacion - CC101

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.

Introduccin a la Ciencia de la Computacion - CC101

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.

Introduccion a la Ciencia de la Computacion - CC101

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.

Un algoritmo de producto tiene tres partes lgicas:


1. Inicializacin del producto al principio.
2. El bucle, que en cada iteracin multiplica un nuevo
entero con el producto.
3. Retorno del resultado despus de salir del bucle.

Introduccion a la Ciencia de la Computacion - CC101

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.

Introduccion a la Ciencia de la Computacion - CC101

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

Ejemplo de ordenamiento de seleccin


i
Introduccion a la Ciencia de la Computacion - CC101

41

Algoritmo de ordenamiento de seleccin


i
Introduccion a la Ciencia de la Computacion - CC101

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

Ejemplo de ordenamiento de burbuja

Introduccion a la Ciencia de la Computacion - CC101

44

Ordenamiento por insercin


El algoritmo de ordenamiento por insercin es una de las tcnicas
de ordenamiento ms comunes, y es a menudo utilizado por los
jugadores de cartas. Cada tarjeta que un jugador coge la inserta en
el lugar que le corresponde en su mano de cartas para mantener
una secuencia particular.

Ordenamiento por insercin


Introduccion a la Ciencia de la Computacion - CC101

45

Ejemplo de ordenamiento por insercin

Introduccion a la Ciencia de la Computacion - CC101

46

Ordenamiento rpido (Quicksort)


Quicksort es un algoritmo de divide y vencers. Quicksort
primero divide una larga lista en dos pequeas sub-listas: los
elementos menores y los elementos mayores. Quicksort puede
ordenar a continuacin las sub-listas de forma recursiva.
funcion quicksort(conjunto)
var list less, greater
if longitud(conjunto) 1
return conjunto //conj. de 0-1 elementos ya esta ordenado
Seleccione y remueva un valor pivot del conjunto
Para cada x en conjunto
if x pivot then colocar x en less
else colocar x en greater
return concatenate(quicksort(less), pivot, quicksort(greater)).
Introduccion a la Ciencia de la Computacion - CC101

47

Ejemplo de ordenamiento
rapido (Quicksort)

Introduccion a la Ciencia de la Computacion - CC101

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.

Introduccion a la Ciencia de la Computacion - CC101

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.

Introduccion a la Ciencia de la Computacion - CC101

50

Ejemplo de bsqueda secuencial


Introduccion a la Ciencia de la Computacion - CC101

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

Ejemplo de bsqueda binaria


Introduccion a la Ciencia de la Computacion - CC101

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.

Introduccion a la Ciencia de la Computacion - CC101

54

Concepto de subalgoritmo
Introduccion a la Ciencia de la Computacion - CC101

55

Structure chart (mapa estructurado)


Otro herramienta que los programadores usan es el mapa
estructurado. Un mapa estructurado es una herramienta de diseo
de alto nivel que muestra la relacin entre los algoritmos y
subalgoritmos. Se utiliza principalmente a nivel de diseo en
lugar de a nivel de programacin.

Introduccion a la Ciencia de la Computacion - CC101

56

RECURSIVIDAD

En general, hay dos enfoques para escribir algoritmos para


resolver un problema. Uno de ellos utiliza la iteracin,
iteracin el otro usa
la recursividad.
recursividad La recursividad es un proceso en el que un
algoritmo se llama a si mismo.

Introduccion a la Ciencia de la Computacion - CC101

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.

Definicin iterativa de factorial


Introduccion a la Ciencia de la Computacion - CC101

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.

Definicin recursiva de factorial


Introduccion a la Ciencia de la Computacion - CC101

59

Determinacin de la solucin recursiva al problema del factorial


Introduccion a la Ciencia de la Computacion - CC101

60

Solucin iterativa

Esta solucin implica generalmente un bucle.

Introduccion a la Ciencia de la Computacion - CC101

61

Solucin recursiva
La solucin no necesita un bucle, ya que el concepto de
recursividad envuelve repeticin.

Introduccion a la Ciencia de la Computacion - CC101

62

Una serie simple: dos soluciones

f(1) = 0
f(2) = 1

f(n)=f(n-1)+f(n-2)

Introduccion a la Ciencia de la Computacion - CC101

63

Una serie simple: solucion 1 (iterativa)

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)

Introduccion a la Ciencia de la Computacion - CC101

64

Una serie simple: solucion 2 (recursiva)

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

Una serie simple: dos soluciones

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);
}

Introduccion a la Ciencia de la Computacion - CC101

66

Una serie simple: solucion 2 (recursiva)


50
48

49
48
47

47

47

46

46

n -> 2n operaciones !!!


Introduccion a la Ciencia de la Computacion - CC101

67

Anlisis de tiempo de ejecucin

Introduccion a la Ciencia de la Computacion - CC101

68

Lo mejor del siglo XX: Top 10 algoritmos


1. 1946: El algoritmo de Metropolis de Monte Carlo.
Carlo Mediante el
uso de procesos aleatorios, este algoritmo ofrece una manera
eficiente para conseguir respuestas a problemas que son demasiado
complicados de resolver en forma exacta.
2. 1947: Mtodo Simplex para programacin lineal.
lineal Una solucin
elegante a un problema comn en planificacin y toma de
decisiones.
3. 1950: Mtodo de iteracin de subespacios de Krylov.
Krylov Una tcnica
para solucin rpida de ecuaciones lineales que abundan en
computacin cientfica.
4. 1951: Enfoque descomposicional para cmputo de matrices.
matrices Un
conjunto de tcnicas para el lgebra lineal numrica.
5. 1957: El compilador Fortran de optimizacin.
optimizacin Cambia cdigo de
alto nivel en cdigo informtico eficiente y legible.
Introduccion a la Ciencia de la Computacion - CC101

69

Lo mejor del siglo XX: Top 10 algoritmos


6. 1959: Algoritmo QR para clculo de valores propios.
propios Otra
operacin crucial de matrices hecha rpida y prctica.
7. 1962: Algoritmos de ordenamiento rpido (Quicksort).
(Quicksort) Para el
manejo eficiente de grandes bases de datos.
8. 1965: Transformada Rpida de Fourier (FFT). Tal vez el
algoritmo de mayor alcance en matemticas aplicadas en uso hoy
en da,. Descompone formas de onda en componentes peridicos.
9. 1977: Deteccin de relacin entre enteros.
enteros Un mtodo rpido
para detectar ecuaciones simples satisfechas por colecciones de
nmeros aparentemente inconexos.
10. 1987: Mtodo rpido multipolar.
multipolar Un gran avance en el
tratamiento de la complejidad de los clculos de n-cuerpos,
aplicado en problemas que van desde la mecnica celeste al
plegamiento de protenas.
Introduccion a la Ciencia de la Computacion - CC101

70

También podría gustarte