Vous êtes sur la page 1sur 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

La figura anterior no muestra que debe hacerse en cada paso. Podemos modificar la figura para mostrar mas detalles.

Definiendo acciones

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

Escribir un algoritmo para hallar el mayor nmero de un conjunto de enteros. No conocemos el nmero de enteros.

Ejemplo 4

Introduccion a la Ciencia de la Computacion - CC101

28

Escribir un algoritmo para hallar el mayor de los primeros 1000 enteros en un conjunto de enteros.

Ejemplo 5

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, el otro usa la 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

Esta solucin implica generalmente un bucle.

Solucin iterativa

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)


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

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

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


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

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

long f(int n) { si(n<= 2) retornar n-1; retornar f(n-1)+f(n-2); }


66

Introduccion a la Ciencia de la Computacion - CC101

Una serie simple: solucion 2 (recursiva)


50 49 48 47 46 47 47 48 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

Vous aimerez peut-être aussi