Вы находитесь на странице: 1из 120

1 de 120

Primer Semestre

COLABORADORES

DIRECTOR DE LA FCA
Dr. Juan Alberto Adam Siade
SECRETARIO GENERAL
L.C. y E.F. Leonel Sebastin Chavarra

COORDINACIN GENERAL
Mtra. Gabriela Montero Montiel
Jefe de la Divisin SUAyED-FCA-UNAM
COORDINACIN ACADMICA
Mtro. Francisco Hernndez Mendoza
FCA-UNAM

COAUTORES
L.C. Gilberto Manzano Pealoza
Mtro. Luis Fernando Ziga Lpez
ACTUALIZACIN
Mtro. Ren Montesano Brand
DISEO INSTRUCCIONAL
Lic. Chantal Ramrez Prez
Mayra Lilia Velasco Chacn
CORRECCIN DE ESTILO
L.F. Francisco Vladimir Aceves Gaytn
DISEO DE PORTADAS
L.CG. Ricardo Alberto Bez Caballero
Mtra. Marlene Olga Ramrez Chavero
L.DP. Ethel Alejandra Butrn Gutirrez

Primer Semestre

DISEO EDITORIAL
Mtra. Marlene Olga Ramrez Chavero

2 de 120

OBJETIVO GENERAL
Al finalizar el curso, el alumno ser capaz de implementar algoritmos en un lenguaje
de programacin.

TEMARIO OFICIAL
(64 horas)

Horas
1. Fundamentos de algoritmos

12

2. Anlisis de algoritmos

12

3. Diseo de algoritmos para la resolucin de problemas

12

4. Implantacin de algoritmos

12

5. evaluaci de algoritmos

16
TOTAL

64

3 de 120
Primer Semestre

INTRODUCCIN GENERAL
Los algoritmos son una secuencia lgica y detallada de pasos para solucionar un
problema. Su campo es amplio y dinmico e intervienen directamente en la vida de las
organizaciones resolviendo problemas mediante programas de computadora en las
distintas reas de la empresa. As, dada su importancia, son objeto de estudio de la
asignatura Anlisis, Diseo e Implantacin de Algoritmos, desarrollada en cinco
unidades.

En la primera unidad, se estudian los conceptos necesarios para comprender los


algoritmos y sus caractersticas, as como los autmatas y los lenguajes formales
utilizados; y se aborda el autmata finito determinista, conocido como mquina de
Turing, y algunos ejemplos de su aplicacin.

En la segunda, se exponen el anlisis del problema, los problemas computables y no


computables, recursividad y algoritmos de ordenacin y bsqueda; y los problemas que
se pueden resolver mediante la mquina de Turing (problemas computables o
decidibles) y los que no se pueden solucionar de esta forma, o tarda bastante su
proceso por la complejidad del algoritmo (problemas no computables). Asimismo se
examina la recursividad, es decir, la capacidad de una funcin de invocarse a s misma.

Dado que en la mayor parte de las aplicaciones empresariales se utilizan, tambin se


analizan los algoritmos de ordenacin, como burbuja, insercin, seleccin y rpido
ordenamiento (quick sort); y de bsqueda, como secuencial, binaria o dicotmica, y la
tcnica hash.

En la tercera unidad, se muestra la importancia de la abstraccin en la construccin de


algoritmos, as como el estudio de las tcnicas de diseo de algoritmos para la solucin
4 de 120
Primer Semestre

de problemas, como algoritmos voraces, programacin dinmica, divide y vencers,


vuelta atrs, y ramificacin y poda.

En la cuarta, se explica la manera de implementar los algoritmos mediante programas


de cmputo en los que se utiliza la programacin estructurada, que consiste en
emplear estructuras de control como si condicin entonces sino, mientras condicin
hacer, hacer mientras condicin, hacer hasta condicin, y para x desde lmite1 hasta
lmite2 hacer. Tambin se estudian los enfoques de diseo de algoritmos como el
descendente (top down) y ascendente (bottom up); el primero conforma una solucin
ms integral del sistema; y el segundo, aunque menos eficiente, es mucho ms
econmico en su implantacin, ya que aprovecha las aplicaciones informticas de los
distintos departamentos o reas funcionales.

Y en la quinta, se trata el refinamiento progresivo de los algoritmos mediante la


depuracin y prueba de programas. Se estudian la documentacin de los programas y
los tipos de mantenimiento preventivo, correctivo y adaptativo.

5 de 120
Primer Semestre

ESTRUCTURA CONCEPTUAL
Definicin de
Algoritmo
Autmatas y
lenguajes formales
Mquina de Turing

Anlisis del problema


Compatibilidad
Algoritmos recursivos
Algoritmos de Bsqueda y
ordenacin

1. Fundamentos
de algoritmos

2. Anlisis de
algoritmos

Anlisis, diseo e
implementacin
de algoritmos
5. Evaluacin
de algoritmos

Refinamiento progresivo
Depuracin de prueba
Documentacin del
programa
Mantenimiento de
programas

3. Diseo de
algoritmos para la
solucin de
problemas
4. Implantacin
de algoritmos

Niveles de abstraccin
para la construccin de
algoritmos
Tcnicas de diseo de
algoritmos

El programa como una expresin


computable de algoritmos
Programacin estructurada
Modularidad
Enfoque de algoritmos

6 de 120
Primer Semestre

UNIDAD 1

Fundamentos de algoritmos

7 de 120
Primer Semestre

OBJETIVO PARTICULAR
Al finalizar la unidad, el alumno podr identificar los componentes y propiedades de los
algoritmos.

TEMARIO DETALLADO
(12horas)
1. Fundamentos de algoritmos
1.1. Definicin de algoritmo
1.2. Propiedades de los algoritmos
1.3 Autmatas y lenguajes formales
1.4 Maquina de Turing

8 de 120
Primer Semestre

INTRODUCCIN
Hoy da, el algoritmo (de Al-Khowarizmi, sobrenombre del clebre matemtico
Mohamed Ben Musa) es una forma ordenada de describir los pasos para resolver
problemas. Es una manera abstracta de reducir un problema a un conjunto de pasos
que le den solucin. Hay algoritmos muy sencillos y de gran creatividad, aunque
tambin algunos conllevan un alto grado de complejidad.

Una aplicacin de los algoritmos la tenemos en los autmatas, los cuales, basados en
una condicin de una situacin dada, llevarn a cabo algunas acciones que ya se
encuentran programadas en ellos. En este orden, ser de gran utilidad involucrarse en
su funcionamiento y terminologa para entender que, en ese contexto de autmatas, los
conceptos alfabeto, frase, cadena vaca, lenguaje, gramtica, etctera, cobran
particular relevancia.

Se definir y estudiar la mquina de Turing, un caso de autmata finito determinista,


que realiza slo una actividad en una situacin dada. Y para conocer su diseo y
funcionamiento, se desarrollan algunos ejemplos.

As, el anlisis de los algoritmos y los autmatas es medular para ejercitar un


pensamiento lgico y abstracto al abordar los problemas de la informtica.

9 de 120
Primer Semestre

1.1. Definicin de algoritmo


Un algoritmo es un conjunto detallado y lgico de pasos para alcanzar un objetivo o
resolver un problema. Por ejemplo, el instructivo para armar un modelo de avin a
escala; cualquier persona, si atiende en forma estricta la secuencia de los pasos,
llegar al mismo resultado.
Los pasos deben ser suficientemente detallados para que el procesador los entienda.
En nuestro ejemplo, el procesador es el cerebro de quien arma el modelo; pero el ser
humano tiende a obviar muchos aspectos y es factible que haga en forma automtica
algunos de los pasos del instructivo, sin detenerse a pensar en cmo llevarlos a cabo.
Esto sera imposible en una computadora, pues requiere de indicaciones muy
puntuales para poder ejecutarlas.
Considrese, por ejemplo, si a una persona se le pide
intercambiar los nmeros 24 y 9; con cierta lgica,
responder inmediatamente 9 y 24.
En tanto, en el procesador de una computadora se
tendra que indicar de qu tipo son los datos a utilizar
para este caso, nmeros enteros; darle nombre a tres
variables, digamos, num1, num2 y aux; asignarle a la
variable num1 el nmero 24 y a num2 el 9.

10 de 120
Primer Semestre

Posteriormente, sealarle que a la variable aux se le asigne el valor contenido en la


variable num1; a num1, el contenido en la variable num2; y a esta ltima, el de la
variable aux. Luego, se deben imprimir los valores de las variables num1 y num2 que
exhibirn los nmeros 9 y 24.
Se requiere, entonces, una gran cantidad de pasos para indicarle a una computadora
que realice la misma tarea que un ser humano; mas es incapaz de efectuar muchas
tareas an.
Otro caso donde podemos notar la forma como el hombre obvia pasos es pidiendo a
una persona que describa el proceso para preparar agua de limn. Seguro nos dira
que toma una jarra de agua, le pone jugo de limn, azcar, y listo. Para una
computadora lo anterior no tendra sentido, ya que carece de unidades exactas y pasos
detallados. Por tanto, los pasos deben tener mayor nivel de precisin, en esta
secuencia:

Inicio del proceso.

Tomar una jarra de 2 litros de capacidad

Llenar la jarra a 4/5 partes con agua natural.

Tomar 4 limones.

Cortar los limones por la mitad.

Exprimir los limones dejando caer el jugo sobre el agua en la jarra.

Tomar el recipiente del azcar.

Agregar 4 cucharadas soperas en la jarra con el agua.

Revolver el agua con el jugo y el azcar por 2 minutos.

Fin del proceso.

En conclusin, cuando se elabora un algoritmo, se tomar en cuenta que la


computadora es como un nio pequeo al cual se le est enseando a realizar algo por
primera vez; y es necesario concretar lo ms posible cada paso que debe da.
11 de 120
Primer Semestre

1.2. Propiedades
de los algoritmos
Para que un algoritmo realmente lo sea, cumplir con las caractersticas o propiedades
que se describen a continuacin.
FINITO
Dentro de la secuencia de pasos para realizar la tarea, debe tener una situacin
o condicin que lo detenga; de lo contrario, se pueden dar ciclos infinitos que
impidan llegar a un trmino.
PRECISO
Un algoritmo no debe dar lugar a criterios. Por ejemplo: qu sucedera si a dos
personas en distintos lugares se les ordenara preparar un pastel; suponemos que
saben cmo hacerlo, y siguiendo las indicaciones de la receta, llegan a un paso
en el que se indica que se agregue azcar al gusto. Entonces, cada persona
incorporara azcar de acuerdo con sus preferencias y el resultado no sera el
mismo: los dos pasteles seran diferentes en sus caractersticas.
Concluimos que este ejemplo no es un algoritmo, puesto que existe una
ambigedad en el paso descrito.
OBTENER EL MISMO RESULTADO
En cualquier circunstancia, si se atienden en forma estricta los pasos del
algoritmo, siempre se debe llegar a un mismo resultado. Ejemplos: obtener el
mximo comn divisor de dos nmeros enteros positivos, armar un modelo a
escala, resolver una ecuacin, etctera.
Si carecen de cualquiera de estas caractersticas o propiedades, los pasos en cuestin
no son algoritmo.

12 de 120
Primer Semestre

1.3. Autmatas y
lenguajes formales1
Un autmata es un modelo computacional consistente en un conjunto de estados bien
definidos, un estado inicial, un alfabeto de entrada y una funcin de transicin.

Este concepto es equivalente a otros como autmata finito o mquina de estados


finitos. En un autmata, un estado es la representacin de su condicin en un instante
dado. El autmata comienza en el estado inicial con un conjunto de smbolos; su paso
de un estado a otro se efecta a travs de la funcin de transicin, la cual, partiendo
del estado actual y un conjunto de smbolos de entrada, lo lleva al nuevo estado
correspondiente.
Histricamente, los autmatas han existido desde la antigedad, pero en el siglo
XVII, cuando en Europa exista gran pasin por la tcnica, se perfeccionaron las
cajas de msica compuestas por cilindros con pas, que fueron inspiradas por
los pjaros autmatas que haba en Bizancio, que podan cantar y silbar.
As, a principios del siglo XVIII, los ebanistas Roentgen y Kintzling mostraron a
Luis XVI un autmata con figura humana llamado la Taedora de Salterio. Por su
parte, la aristocracia se apasionaba por los muecos mecnicos de encaje, los
cuadros con movimiento, y otros personajes.

Vase G. Manzano, Tutorial para la asignatura Anlisis, diseo e implantacin de algoritmos, Mxico:
Fondo Editorial FCA, 2003.
13 de 120
Primer Semestre

Los inventores ms clebres son Pierre Jacquet Droz, autor del Dibujante y los
Msicos; y Jacques Vaucanson, hacedor del Pato con Aparato Digestivo, un
autmata que aleteaba, parloteaba, tragaba grano y evacuaba los residuos. Este
autor quiso pasar de lo banal a lo til y sus trabajos culminaron en el telar de
Joseph Marie Jaquard y la mquina de Jean Falcon, dirigida por tarjetas
perforadas.
El autmata ms conocido en el mundo es la mquina de Turing, elaborado por
el matemtico ingls Alan Mathison Turing.

En trminos estrictos, se puede decir que un termostato es un autmata, puesto que


regula la potencia de calefaccin de un aparato (salida) en funcin de la temperatura
ambiente (dato de entrada), pasando de un estado trmico a otro.
Un ejemplo ms de autmata en la vida cotidiana es un elevador, ya que es capaz de
memorizar las diferentes llamadas de cada piso y optimizar sus ascensos y descensos.
Tcnicamente, hay diferentes herramientas para definir
el comportamiento de un autmata, entre las cuales se
encuentra el diagrama de estado. En ste se pueden
visualizar los estados como crculos que en su interior
registran su significado, y flechas que representan la
transicin entre estados y la notacin de entrada/salida,
que provoca el cambio entre estados.
En el ejemplo se muestran cuatro estados diferentes de un autmata y se define lo
siguiente. Partiendo del estado "00", si se recibe una entrada "0", la salida es "0" y el
autmata conserva el estado actual; pero si la entrada es "1", la salida ser "1" y el
autmata pasa al estado "01".

14 de 120
Primer Semestre

Este comportamiento es homogneo para todos los estados del autmata. Vale la pena
resaltar que el autmata que se representa aqu tiene un alfabeto binario (0 y 1).
Otra herramienta de representacin del comportamiento de los autmatas es la tabla
de estado, que consiste en cuatro partes: descripcin del estado actual, descripcin de
la entrada, descripcin del estado siguiente y descripcin de las salidas.
A continuacin se muestra la tabla correspondiente al diagrama que se present en la
figura anterior.
Estado actual

Entrada

Estado siguiente

Salida

En la tabla se puede notar que el autmata tiene dos elementos que definen su estado,
A y B, as como la reafirmacin de su alfabeto binario. Adems, se deduce la funcin
de salida del autmata, la cual est definida por la multiplicacin lgica de la negacin
del estado de A por la entrada x:
y = A' x

15 de 120
Primer Semestre

ALFABETO
Un alfabeto es el conjunto de todos los smbolos vlidos o posibles para una aplicacin.
En el campo de los autmatas, est formado por todos los caracteres que utiliza para
definir sus entradas, salidas y estados.
En algunos casos, el alfabeto puede ser infinito o tan simple como el alfabeto binario
empleado en el ejemplo del punto anterior, donde slo se aplican los smbolos 1 y 0
para representar cualquier expresin de entrada, salida y estado.
FRASE
Una frase es la asociacin de un conjunto de smbolos definidos en un alfabeto
(cadena), cuya propiedad es tener sentido, significado y lgica.
Las frases parten del establecimiento de un vocabulario que dispone las palabras
vlidas del lenguaje sobre la base del alfabeto definido. Una frase vlida es aquella que
cumple con las reglas de la gramtica establecida.

CADENA VACA
Se dice que una cadena es vaca cuando la longitud del conjunto de
caracteres que utiliza es igual a cero; es decir, es una cadena sin
caracteres asociados.
Este tipo de cadenas no siempre implica el no cambio de estado en un autmata, ya
que en la funcin de transicin puede existir una definicin de cambio de estado
asociada a la entrada de una cadena vaca.
LENGUAJE
Un lenguaje es un conjunto de cadenas que obedecen a un alfabeto fijado. Y, entendido
como un conjunto de entradas, puede o no ser resuelto por un algoritmo.

GRAMTICAS FORMALES
Una gramtica es una coleccin estructurada de palabras y frases ligadas por reglas
que definen el conjunto de cadenas de caracteres que representan los comandos
completos que pueden ser reconocidos por un motor de discurso.

16 de 120
Primer Semestre

Una forma de representar las gramticas es la Bakus-Naur (BNF), usada para describir
la sintaxis de un lenguaje dado, as como su notacin.
La funcin de una gramtica es definir y enumerar las palabras y frases vlidas de un
lenguaje. La forma general definida por BNF es denominada regla de produccin, y se
representa como:
<regla> = sentencias y frases. *
Las partes de la forma general BNF se definen como sigue:

El "lado izquierdo" o regla es el identificador nico de las reglas definidas para el


lenguaje. Puede ser cualquier palabra, con la condicin de estar encerrada entre
los smbolos < >. Este elemento es obligatorio en la forma BNF.

El operador de asignacin = es un elemento obligatorio.

El "lado derecho", o sentencias y frases, define todas las posibilidades vlidas


en la gramtica definida.

El delimitador de fin de instruccin (punto) es un elemento


obligatorio.

Un ejemplo de una gramtica que define las opciones de un men asociado a una
aplicacin de ventanas puede ser:
<raiz> = ARCHIVO
| EDICION
| OPCIONES
| AYUDA.

En este ejemplo, podemos encontrar claramente los conceptos de smbolo terminal y


smbolo no-terminal. El primero es una palabra del vocabulario definido en un lenguaje,
por ejemplo, ARCHIVO, EDICION, etc.

17 de 120
Primer Semestre

Y el segundo, es una regla de produccin de la gramtica, por ejemplo:


<raiz> = <opcion>.
<opcion> = ARCHIVO
| EDICION
| OPCIONES
| AYUDA

Otro ejemplo ms complejo que involucra el uso de frases es el siguiente:


<raiz> = Hola mundo | Hola todos

En los casos anteriores se us el smbolo | (OR), el cual denota opciones de seleccin


mutuamente excluyentes, lo que quiere decir que slo se puede elegir una opcin entre
ARCHIVO, EDICION, OPCIONES y AYUDA, en el primer ejemplo; as como "Hola
mundo" y "Hola todos" en el segundo.
Un ejemplo real aplicado a una frase simple de uso comn como "Me puede mostrar su
licencia", con la opcin de anteponer el ttulo Seorita, Seor o Seora, se puede
estructurar de la manera siguiente en una gramtica BNF:
<peticion> = <comando> | <titulo> <comando> .
<titulo> = Seor | Seora | Seorita.

<comando> = Me puede mostrar su licencia.


Hasta este momento slo habamos definido reglas de produccin que hacan
referencia a smbolos terminales. Sin embargo, en el ejemplo anterior, se puede
observar que la regla <peticion> est formada slo por smbolos no-terminales. Otra
propiedad que nos permite visualizar el ejemplo es la definicin de frases y palabras
opcionales, es decir, si analizamos la regla de produccin <peticion>, detectamos que
una peticin vlida puede prescindir del uso del smbolo <titulo>; mientras que el
smbolo <comando> se presenta en todas las posibilidades vlidas de <peticion>.

18 de 120
Primer Semestre

Una sintaxis para simplificar el significado de <peticion> es el operador "?":


<peticion> = <titulo>? <comando>.
Con la sintaxis anterior se define que el smbolo <titulo> es opcional, o sea, que puede
ser omitido sin que se pierda la validez de la <peticion>.
LENGUAJE FORMAL
De lo anterior podemos concluir que un lenguaje formal est constituido por un alfabeto, un
vocabulario y un conjunto de reglas de produccin definidas por gramticas.
Las frases vlidas de un lenguaje formal son aquellas que se crean con los smbolos y
palabras definidas, tanto en el alfabeto como en el vocabulario del lenguaje; y que cumplen con
las reglas de produccin definidas en las gramticas.

JERARQUIZACIN DE GRAMTICAS
Las gramticas pueden ser diversas, de acuerdo con las caractersticas que rigen la
formulacin de reglas de produccin vlidas, todas los cuales parten de gramticas arbitrarias,
o sea, las que consideran la existencia infinita de cadenas formadas por los smbolos del
lenguaje.

Los principales tipos de gramticas se presentan a continuacin.


GRAMTICAS SENSIBLES AL CONTEXTO
En este tipo de gramticas, el lado derecho de la regla de produccin siempre debe
ser igual o mayor que el lado izquierdo.
GRAMTICAS INDEPENDIENTES DEL CONTEXTO
Cumplen con las propiedades de la gramtica sensible al contexto, y se distinguen
porque el lado izquierdo de la regla de produccin slo debe tener un elemento, y ste
no puede ser terminal.

19 de 120
Primer Semestre

GRAMTICAS REGULARES
Cumplen con las caractersticas de la gramtica independiente del contexto y, adems,
se restringen a travs de las reglas de produccin para generar slo reglas de los dos
tipos anteriores.

PROPIEDADES DE INDECIDIBILIDAD
Se dice que un lenguaje es indecidible si sus miembros no pueden ser identificados por un algoritmo
que restrinja todas las entradas en un nmero de pasos finito. Otra de sus propiedades es que no
es reconocido como una entrada vlida en una mquina de Turing.
Asociados a esta modalidad de lenguaje existen, de la misma manera, problemas
indecidibles: aquellos que no pueden ser resueltos, con todas sus variantes, por un
algoritmo.
En contraposicin con el lenguaje indecidible y los problemas vinculados a este tipo
de lenguajes, existen los problemas decidibles, relacionados con lenguajes del mismo
tipo y que tienen las caractersticas opuestas.
Esta clase de lenguajes se conocen tambin como recursivos o totalmente decidibles.

1.4. Mquina de Turing


El concepto de algoritmo como un conjunto de pasos lgicos y secuenciales para
solucionar un problema fue implementado en 1936 por Alan Turing, matemtico ingls,
en la mquina de Turing. sta se integra de tres elementos: cinta, cabeza de lecturaescritura y programa. La cinta tiene la propiedad de ser infinita (no acotada por sus
extremos) y estar dividida en segmentos del mismo tamao, los cuales almacenan
cualquier smbolo o estar vacos. Asimismo, puede interpretarse como el dispositivo de
almacenamiento.

20 de 120
Primer Semestre

La cabeza de lectura-escritura es el dispositivo que lee y escribe en la cinta. Acta en


un segmento y ejecuta slo una operacin a la vez. Tambin tiene un nmero finito de
estados que cambian de acuerdo con la entrada y las instrucciones definidas en el
programa que lo controla.

El ltimo elemento, el programa, es un conjunto de instrucciones que controlan los


movimientos de la cabeza de lectura-escritura, indicndole hacia dnde ha de moverse
y si debe escribir o leer en la celda donde se encuentre.
Actualmente, la mquina de Turing es una de las principales abstracciones utilizadas
en la teora moderna de la computacin, pues auxilia en la definicin de lo que una
computadora puede o no puede hacer.
Mquina de Turing como funcin
La mquina de Turing es una funcin cuyo dominio se encuentra en la cinta infinita,
donde se plasma su co-dominio, esto es: todos los posibles valores de entrada se
hallan en la cinta y todos los resultados de su operacin se expresan tambin ah.
La mquina de Turing es el antecedente ms remoto de un autmata y, al igual que
ste, se define con varias herramientas: diagrama de estado, tabla de estado y funcin.

21 de 120
Primer Semestre

Hay

problemas

que

pueden
Proceso computable

resolverse mediante una mquina de

Puede implementarse en un algoritmo o

Turing, y otros no. Los primeros se

mquina de Turing; definirse en un lenguaje

llaman computables; y los segundos,

decidible;

no computables o indecidibles. De

programa de la mquina de Turing.

implementarse

como

el

ellos derivan, respectivamente, los


procesos

computables

los

Proceso no computable

no

No puede implementarse con una mquina

computables.

de Turing por no tener solucin para todas


sus posibles entradas. Se especifica en un

Un ejemplo de la mquina de Turing

lenguaje

lo tenemos en la enumeracin de

interpretado por una mquina de Turing.

indecidible

imposible

de

ser

binarios, como se muestra a


continuacin.
Ejemplo 1

Disear una mquina de Turing que enumere los cdigos binarios de la siguiente forma:
0, 1,10, 11, 110, 111,1110,...
Solucin:
Se define la mquina mediante:
Q = {q1} (Conjunto de estados)
= {0, 1} (Alfabeto de salida)
= {0, b} (Alfabeto de entrada)
s = q1 (Estado inicial)

Y dado por las siguientes instrucciones:


22 de 120
Primer Semestre

(q1, 0)

= (q1, 1, D)

Que se lee como: si se encuentra en estado q1 y lee un cero, entonces cambia a estado
q1, escribe uno y desplazar a la derecha.
(q1, b)

= (q1, 0, Sin Desplazamiento)

Que se lee como: si se encuentra en estado q1 y lee una cadena vaca, entonces
cambia a estado q1, escribe un cero y no hay desplazamiento.
Si en esta mquina de Turing se comienza con la cabeza de lectura-escritura sobre el 0,
tenemos la secuencia:
(q1, 0b) (q1, 1b) (q1, 10b) (q1, 11b) (q1, 110b)
NOTA: el carcter subrayado indica que la cabeza lectora/grabadora de la mquina de Turing
est posicionada sobre ese carcter.

Ejemplo 2
Disear una mquina de Turing que acepte el lenguaje L= {anbm| n y m >=1} por medio
de la eliminacin de las aes y bes que estn en los extremos opuestos de la cadena. Es
decir, usando c y d, la cadena aaabbb primero sera transformada en caabbd; despus,
en ccabdd; y por ltimo, en cccddd.
Solucin:

Consideremos la mquina de Turing definida mediante:


Q = {q1, q2, q3, q4, q5} (Conjunto de estados)
= {a, b, c, d} (Alfabeto de salida)
= {a, b, } (Alfabeto de entrada)
F = {q4} (Estado final)
s = {q1} (Estado inicial)

Y dado por las siguientes instrucciones:


(q1, a)

(q2, c, D)

(q1, b)

(q2, c, D)
23 de 120

Primer Semestre

(q1, c)

(q4, d, ALTO)

(q1, d)

(q4, d, ALTO)

(q2, a)

(q2, a, D)

(q2, b)

(q2, b, D)

(q2, )

(q5, , I)

(q2, d)

(q5, d, I)

(q3, a)

(q3, a, I)

(q3, b)

(q3, b, I)

(q3, c)

(q1, c, D)

(q5, a)

(q3, a, I)

(q5, b)

(q3, d, I)

(q5, c)

(q4, c, ALTO)

Si en esta mquina de Turing se comienza con la cabeza lectora-escritora sobre la


primera de la izquierda, se tiene esta secuencia de movimientos:

(q1, aaabbb)

(q2, caabbb)

(q2, caabbb)

(q2, caabbb)

(q2, caabbb)

(q2, caabbb)

(q2, caabbb ) (q5, caabbb ) (q3, caabbd)

(q3, caabbd)

(q3, caabbd)

(q3, caabbd)

(q3, caabbd)

(q1, caabbd)

(q2, ccabbd)

(q2, ccabbd)

(q2, ccabbd)

(q2, ccabbd)

(q5, ccabbd)

(q3, ccabdd)

(q3, ccabdd)

(q3, ccabdd)

(q1, ccabdd)

(q2, cccbdd)

(q2, cccbdd)

(q5, cccbdd)

(q3, cccddd)

(q1, cccddd)

(q4, cccddd)
ALTO.

Con lo anterior queda ejemplificado el diseo de una mquina de Turing y su desarrollo.

24 de 120
Primer Semestre

RESUMEN DE LA UNIDAD
Se presentaron conceptos y principios bsicos de los algoritmos, sus caractersticas y
terminologa, para aplicarlos en la resolucin de problemas (razn de ser de los
algoritmos). Con el apoyo de ejemplos, se gener una mejor comprensin de los
puntos tratados, ya que los algoritmos pueden ser muy sencillos o muy complejos.

Adems, se abord el tema de los autmatas, una aplicacin de los algoritmos. Los
autmatas, basados en una condicin de una situacin dada, llevarn a cabo acciones
que ya se encuentran programadas. En particular, se defini y estudi la mquina de
Turing, un ejemplo de los autmatas finitos deterministas que realizan slo una
actividad en una situacin dada.

25 de 120
Primer Semestre

BIBLIOGRAFA DE LA UNIDAD

SUGERIDA

Autor

Captulo

Pginas

Du y Ker-I Ko (2012)

7. Linear Programming

245-295

UNIDAD 2
26 de 120
Primer Semestre

Anlisis de algoritmos

OBJETIVO PARTICULAR

27 de 120
Primer Semestre

Al finalizar la unidad, el alumno podr analizar un problema determinado y buscar una


solucin a partir de un algoritmo.

TEMARIO DETALLADO
(12 HORAS)
2. Anlisis de algoritmos
2.1.1 Anlisis del problema
2.1.2 Computabilidad
2.1.3 Algoritmos cotidianos
2.1.4 Algoritmos recursivos
2.1.5 Algoritmos de bsqueda y ordenacin

INTRODUCCIN
En este tema, se realiza una descripcin de la etapa de anlisis para recabar la
informacin necesaria que indique una accin para la solucin de un problema, y se

28 de 120
Primer Semestre

calcula el rendimiento del algoritmo considerando la cantidad de datos a procesar y el


tiempo que tarde su procesamiento.
Se aborda, adems, la computabilidad como solucin de problemas a travs del
algoritmo de la mquina de Turing, de modo que se pueda interpretar un fenmeno a
travs de un cmulo de reglas establecidas. Y se utiliza la construccin de modelos
para abstraer una expresin a sus caractersticas ms sobresalientes que sirvan al
objetivo del modelo mismo.
Tambin se tratan los problemas decidibles, que pueden resolverse por un conjunto
finito de pasos con una variedad de entradas.
Otro punto a abarcar es la recursividad, propiedad
de una funcin de invocarse repetidamente a s
misma hasta encontrar un caso base que le asigne
un resultado y retorne esta solucin hasta la
funcin que la invoc. La recursin, entonces,
puede definirse a travs de la induccin.

29 de 120
Primer Semestre

La solucin recursiva implica la abstraccin, pero dificulta la comprensin de su


funcionamiento. Su complejidad puede calcularse a partir de una funcin y elevarse al
nmero de veces que la funcin recursiva se llame a s misma.
Por ltimo, se estudian los diferentes mtodos de ordenacin y bsqueda, de uso
frecuente en la solucin de problemas de negocios, por lo que se hace indispensable su
comprensin. Ordenar es organizar un conjunto de datos de manera que faciliten la
tarea del usuario de la informacin, en su bsqueda y acceso a un elemento
determinado.

2.1. Anlisis del problema


El anlisis del problema es un proceso para recabar la informacin
necesaria para emprender una accin que lo solucione.

Diversos problemas requieren algoritmos diferentes. Un problema puede llegar a tener


ms de un algoritmo que lo solucione, mas la dificultad se centra en saber cul est
mejor implementado, es decir, el que, dependiendo del tipo de datos a procesar, tenga
un tiempo de ejecucin ptimo. En este sentido, para determinar el rendimiento de un
algoritmo se deben considerar dos aspectos:

Cantidad de datos de entrada a procesar.

Tiempo necesario de procesamiento.

30 de 120
Primer Semestre

El tiempo de ejecucin depende del tipo de datos de entrada, clasificados en tres casos
que se presentan a continuacin.
Caso ptimo
Datos de entrada con las mejores condiciones. Ejemplo: que el conjunto de datos se
encuentre completamente ordenado.

Caso medio
Conjunto estndar de datos de entrada. Ejemplo: que el 50% de los datos est ordenado
y el 50% restante no.

Peor caso
Datos de entrada ms desfavorable. Ejemplo: que los datos se encuentren completamente
desordenados.

Mediante el empleo de frmulas matemticas es posible calcular el tiempo de ejecucin


del algoritmo y conocer su rendimiento en cada uno de los casos ya presentados. Sin
embargo, hay algunos inconvenientes para no determinar con exactitud ese
rendimiento:

Algunos algoritmos son muy sensibles a los datos de entrada, modificando cada
vez su rendimiento y causando que entre ellos no sean comparables en
absoluto.

A veces, se presentan algoritmos bastante complejos, de los cuales es imposible


obtener resultados matemticos especficos.

No obstante lo anterior, en la mayora de los casos es factible calcular el tiempo de


ejecucin de un algoritmo, de modo que se puede seleccionar el algoritmo con mejor
rendimiento para un problema especfico.
31 de 120
Primer Semestre

2.2. Computabilidad
Una de las funciones principales de la computacin ha sido la solucin de problemas a
travs del uso de la tecnologa. Pero esto no ha logrado realizarse en la totalidad de los
casos debido a la computabilidad, caracterstica que tienen ciertos problemas de poder
resolverse a travs de un algoritmo, por ejemplo, una mquina de Turing.
Con base en esta propiedad, los problemas se dividen en tres categoras: irresolubles,
solucionables y computables (estos ltimos son un subconjunto de los segundos).

Representacin de un fenmeno descrito


Todos los fenmenos de la naturaleza poseen caractersticas intrnsecas que los
particularizan y diferencian unos de otros; y la percepcin que se tenga de esos rasgos
posibilita tanto su abstraccin como su representacin a partir de ciertas herramientas.
Ahora bien, la percepcin de un fenmeno implica conocimiento. Y cuando se logra su
representacin, se dice que dicho conocimiento se convierte en transmisible. Esta
representacin puede realizarse utilizando diferentes tcnicas de abstraccin, desde
una pintura hasta una funcin matemtica; ms la interpretacin dada a los diferentes
tipos de representacin vara de acuerdo con dos elementos: la regulacin de la tcnica
empleada y el conocimiento del receptor.

32 de 120
Primer Semestre

De esta manera, un receptor con ciertos conocimientos


acerca de arte, podr tener una interpretacin distinta a
la de otra persona con el mismo nivel cuando se observa
una pintura; pero un receptor con un rango de
conocimientos matemticos anlogo al nivel de otro
receptor siempre dar la misma interpretacin a una
expresin matemtica. Esto se debe a que en el primer
caso intervienen factores personales de interpretacin
que hacen vlidas las diferencias; mientras que en el
segundo se tiene un cmulo de reglas que no permiten
variedad

de

interpretaciones

sobre

una

misma

expresin.
Nos enfocaremos en la representacin de fenmenos
del segundo caso.

Modelo
La representacin de los fenmenos se hace a travs de modelos: abstracciones que
destacan las caractersticas ms sobresalientes de ellos, o bien las que sirvan al
objetivo para el cual se realiza el modelo.
Los problemas computables se representan a travs de lenguaje matemtico o con la
definicin de algoritmos. Es importante mencionar que todo problema calificado como
computable debe poder resolverse con una mquina de Turing.

33 de 120
Primer Semestre

Problema de decisin
Un problema de decisin es aquel cuya respuesta puede mapearse al conjunto de
valores {0,1}, esto es, que tiene slo dos posibles soluciones: s o no. Su
representacin se realiza a travs de una funcin cuyo dominio sea el conjunto citado.
Se dice que un problema es decidible cuando se resuelve en un nmero finito de pasos
por un algoritmo que recibe todas las entradas posibles para dicho problema. El
lenguaje con el que se implementa dicho algoritmo se denomina lenguaje decidible o
recursivo.
Al contrario, un problema no decidible es aquel que no puede solucionarse por un
algoritmo en todos sus casos, ni su lenguaje asociado puede ser reconocido por una
mquina de Turing.

2.3. Algoritmos cotidianos


Son todos aquellos algoritmos que nos ayudan a solucionar problemas de la vida
cotidiana y de los cuales seguimos su metodologa sin percibirlo en forma consciente,
como en el siguiente ejemplo.
Algoritmo para cambiar una llanta ponchada:
Paso 1: poner el freno de mano del automvil.
Paso 2: sacar el gato, la llave de cruz y la llanta de refaccin.
Paso 3: aflojar los birlos de la llanta con la llave de cruz.
Paso 4: levantar el auto con el gato.
Paso 5: quitar los birlos y retirar la llanta desinflada.
Paso 6: colocar la llanta de refaccin y colocar los birlos.
Paso 7: bajar el auto con el gato.
Paso 8: apretar los birlos con la llave de cruz.
Paso 9: guardar la llanta de refaccin y la herramienta.
Resultado: llanta de refaccin montada.
34 de 120
Primer Semestre

2.4. Algoritmos recursivos


Las funciones recursivas son aquellas que hacen llamadas a s mismas en su
definicin, simplificando los valores originales de entrada. Se implementan cuando el
problema a resolver puede simplificarse en versiones ms pequeas del mismo
problema, hasta llegar a casos sencillos de fcil resolucin.

Los primeros pasos de una funcin recursiva corresponden a la clusula base, que es
el caso conocido hasta donde la funcin descender para comenzar a regresar los
resultados, hasta llegar a la funcin con el valor que la invoc.
El funcionamiento de una funcin recursiva puede verse como:

Introduccin a la induccin
La recursin se define a partir de tres elementos, uno de stos es la clusula de
induccin matemtica. A travs de ella, se define un mecanismo para encontrar todos
los posibles elementos de un conjunto recursivo, partiendo de un subconjunto
conocido; o bien, para probar la validez de la definicin de una funcin recursiva desde
un caso base.
35 de 120
Primer Semestre

El mecanismo que la induccin define parte del establecimiento de reglas que hacen
factible generar nuevos elementos, tomando como punto de partida una semilla (caso
base).
Primer principio

Segundo principio

Si el paso base y el paso inductivo

Se basa en afirmaciones de la forma x

asociados a una funcin recursiva pueden

P(x). Esta forma de induccin no requiere

ser probados, la funcin ser vlida para

del paso bsico; asume que P(x) es vlido

todos los casos que caigan dentro del

para todo elemento del dominio.

dominio de la misma. De igual manera, si


un elemento arbitrario del dominio cumple
con las propiedades definidas en las
clusulas

inductivas,

su

sucesor

predecesor, generado segn la clusula


inductiva, tambin cumplir con dichas
propiedades.

Definicin de funciones recursivas


Como ya se mencion, la definicin recursiva consta de tres clusulas diferentes:
bsica, inductiva y extrema.
BSICA
Especifica la semilla del dominio a partir de la cual surgirn todos los elementos del
contradominio (resultado de la funcin), utilizando las reglas definidas en la clusula
inductiva. Este conjunto de elementos se denomina caso base de la funcin que se est
definiendo.

INDUCTIVA
36 de 120
Primer Semestre

Establece la manera como los elementos del dominio pueden ser combinados para generar
los elementos del contradominio. Esta clusula afirma que, a partir de los elementos del
dominio, se llega a un contradominio con propiedades anlogas.

EXTREMA
Afirma que, a menos que el contradominio demuestre ser un valor vlido, aplicando las
clusulas base e inductiva un nmero finito de veces, la funcin no ser vlida.

A continuacin se desarrolla un ejemplo de la definicin de las clusulas para una


funcin recursiva que genera nmeros naturales:
Paso bsico
Demostrar que P(n0) es vlido.
Induccin
Demostrar que para cualquier entero k n0, si el valor generado por P(k) es vlido, el
valor generado por P(k+1) tambin lo es.
A travs de la demostracin de estas clusulas, se puede certificar la validez de la
funcin P(n0) para la generacin de nmeros naturales.
A continuacin, se ejemplifica el empleo de la induccin matemtica en una funcin
sencilla cuyo dominio es el conjunto de los nmeros naturales.
Sea P(n) 1 3 5 ... (2n 1) n 2 ,

para cualquier valor n N

El primer valor para el cual debe ser vlida la funcin es para cuando n = 1.
37 de 120
Primer Semestre

Si P(n) : (2n 1) n 2 debe cumplir :


P(1) ((2 *1) 1) 12

de lo anterior observamos (2 *1) 1 2 1 1 y 12 1

La funcin P(n) cumple para el valor n = 1. Ahora debemos suponer que la funcin P(n)
cuando n = k (donde k representa cualquier nmero natural) tambin cumple; por tanto,
decimos que es verdadera. De esta forma, suponemos que realizamos un proceso
continuo de evaluacin a partir del 1 hasta k realizando incrementos de 1 en 1, con lo
que obtenemos:
P(1) : 1 1
P(2) : 1 3 2 2 4
P(3) : 1 3 5 3 2 9

P(k ) : 1 3 5 (2k 1) k 2 que es nuestra hiptesis .

Despus, se comienza con el proceso de induccin, donde se demostrar que para


valores de n = k + 1 (o en otras palabras, para el nmero siguiente de k) la funcin p(n)
tambin es vlida.
P(k 1) : 1 3 5 (2k 1) (2(k 1) 1) k 1

Como la funcin se genera a partir de una serie de sumas de elementos, podemos


decir que si a nuestra funcin hiptesis P(k) le agregamos el elemento k + 1 en ambos
lados de la ecuacin, debemos llenar al resultado obtenido en P(k+1), en este caso:
1 3 5 (2k 1) (2(k 1) 1) k 2 2k 1 1

Entonces, observamos que tomamos la funcin P(k) y solamente le agregamos el


elemento (2(k + 1) 1) situado en el lado izquierdo de la sumatoria de P(k + 1). A

38 de 120
Primer Semestre

continuacin, desarrollando matemticamente el lado derecho de la ltima ecuacin,


llegamos a demostrar que k 2 2k 1 1 k 12

k 2 2k 1 1 k 2 2k 2 1 k 2 2k 1
como k 1 k 2 2k 1
2

As, la demostracin est completa y P(n) es aplicable a cualquier valor de n.


De este modo, la recursividad nace del proceso de incremento de valores de n desde 1
hasta k, para ir validando los resultados de la funcin P(n), donde la misma funcin es
evaluada una y otra vez hasta llegar al valor deseado.
Clculo de complejidad de una funcin recursiva
Generalmente, las funciones recursivas, por su funcionamiento de llamadas a s
mismas, requieren ms cantidad de recursos (memoria y tiempo de procesador) que
los algoritmos iterativos.
Un mtodo para el clculo de la complejidad de una funcin recursiva consiste en
calcular la complejidad individual de la funcin y despus elevar esta funcin a n,
donde n es el nmero estimado de veces que la funcin deber llamarse a s misma
antes de llegar al caso base.

2.5. Algoritmos de bsqueda


y ordenacin
Al utilizar matrices o bases de datos, las tareas que se utilizan con ms frecuencia son
la ordenacin y la bsqueda de los datos, para las cuales existen diferentes mtodos
ms o menos complejos, segn lo rpidos o eficaces que sean.
Algoritmos de bsqueda
SECUENCIAL

39 de 120
Primer Semestre

Este mtodo de bsqueda, tambin conocido como lineal, es el ms sencillo. Consiste en


buscar desde el principio de un arreglo desordenado el elemento deseado, y continuar con
cada uno de los elementos del arreglo hasta hallarlo, o hasta que ha llegado al final del
arreglo y terminar.

BINARIA O DICOTMICA
Para este tipo de bsqueda es necesario que el arreglo est ordenado. El mtodo
consiste en dividir el arreglo por su elemento medio en dos subarreglos ms
pequeos, y comparar el elemento con el del centro. Si coinciden, la bsqueda
termina. Cuando el elemento es menor, se busca en el primer subarreglo; y si es
mayor, en el segundo.

Por ejemplo, para buscar el elemento 41 en el arreglo {23, 34, 41, 52, 67, 77, 84, 87,
93}, se realizaran los siguientes pasos:
1. Se toma el elemento central y se divide el arreglo en dos:
{23, 34, 41, 52}-67-{77, 84, 87, 93}
2. Como el elemento buscado (41) es menor que el central (67), debe estar en el primer
subarreglo:
{23, 34, 41, 52}
3. Se vuelve a dividir el arreglo en dos:
{23}-34-{41, 52}
4. Como el elemento buscado es mayor que el central, debe estar en el segundo
subarreglo:
{41, 52}
40 de 120
Primer Semestre

5. Se vuelve a dividir en dos:


{}-41-{52}
6. Como el elemento buscado coincide con el central, lo hemos encontrado. Si el
subarreglo a dividir est vaco {}, el elemento no se encuentra en el arreglo y la
bsqueda termina.
Tabla hash

Una tabla hash es una estructura de datos que asocia claves con valores. Su uso ms frecuente se centra en

las operaciones de bsqueda, ya que permite el acceso a los elementos almacenados en la tabla, a partir de
una clave generada.

Las tablas hash se aplican sobre arreglos que almacenan grandes cantidades de
informacin; sin embargo, como utilizan posiciones pseudoaleatorias, el acceso a su
contenido es bastante lento.
Funcin hash
La funcin hash realiza la transformacin de claves (enteros o cadenas de caracteres)
a nmeros conocidos como hash, que contengan enteros en un rango [0..Q-1], donde
Q es el nmero de registros que podemos manejar en memoria, los cuales se
almacenan en la tabla hash.
La funcin h(k) debe

ser rpida y fcil de calcular.


minimizar las colisiones.

Hashing multiplicativo
Esta tcnica trabaja multiplicando la clave k por s misma o por una constante, usando
despus alguna porcin de los bits del producto como una localizacin de la tabla hash.

41 de 120
Primer Semestre

Tiene como inconvenientes que las claves con muchos ceros se reflejarn en valores
hash tambin con ceros; y que el tamao de la tabla est restringido a ser una potencia
de 2.
Para evitar las restricciones
anteriores se debe calcular:
h(k) = entero [Q * Frac(C*k)]
Donde Q es el tamao de la tabla;
k, el valor a transformar; Frac, el
valor de la fraccin del producto a
tomar y 0 <= C <= 1.
Hashing por divisin
En este caso, la funcin se calcula simplemente como h(k) = modulo (k,Q), usando el 0
como el primer ndice de la tabla hash de tamao Q. Es importante elegir el valor de Q
con cuidado. Por ejemplo, si Q fuera par, todas las claves pares seran aplicadas a
localizaciones pares, lo que constituira un sesgo muy fuerte. Una regla simple para
seleccionar Q es tomarlo como un nmero primo.
Algoritmos de ordenacin
Ordenar significa reagrupar o reorganizar un conjunto de datos u objetos en una
secuencia especfica, de forma ascendente (de menor a mayor) o descendente (de
mayor a menor).La seleccin de uno u otro mtodo depende de si se requiere hacer
una cantidad considerable de bsquedas; es importante el factor tiempo.
Los mtodos de ordenacin ms conocidos son burbuja, seleccin, insercin y rpido
ordenamiento (quick sort), que se analizan a continuacin.
Burbuja
Es el mtodo ms sencillo, pero menos eficiente. Se basa en la comparacin de
elementos adyacentes e intercambio de los mismos si stos no guardan el orden
deseado; se van comparando de dos en dos los elementos del vector. El elemento
42 de 120
Primer Semestre

menor sube por el vector como las burbujas en el agua, y los elementos mayores van
descendiendo por el vector.
Pasos a seguir para ordenar un vector con este mtodo:
Paso
1

Descripcin
Asigna a n el tamao del vector. Si el tamao del vector
es igual a 10 elementos, entonces n vale 10.

Colocarse en la primera posicin del vector. Si el nmero


de posicin del vector es igual a n, entonces FIN.

Comparar el valor de la posicin actual con el valor de


la siguiente posicin. Si el valor de la posicin actual es
mayor que el de la siguiente posicin, entonces
intercambiar los valores.

Si el nmero de la posicin actual es igual a n -1,


entonces restar 1 a n y regresar al paso 2; si no, avanzar
a la siguiente posicin para que quede como posicin
actual, y regresar al paso 3.

43 de 120
Primer Semestre

Vemoslo con un ejemplo. Si el vector est formado por cinco enteros positivos,
entonces n es igual a 5. Se procede como sigue

Valores
Posicin

n=5

n=4

n=3

n=2

n=1

NOTA: las celdas de color gris claro representan la posicin actual; y las ms oscuras,
la posicin siguiente, segn los pasos que se van realizando del algoritmo.

Seleccin
En este mtodo se hace la seleccin repetida del elemento menor de una lista de datos
no ordenados, para colocarlo como el siguiente elemento de una lista de datos
ordenados que crece.
La totalidad de la lista de elementos no ordenados debe estar disponible para que sea
posible elegir el elemento con el valor mnimo en esa lista. Sin embargo, la lista
ordenada podr ser puesta en la salida, a medida que avancemos.
Los mtodos de ordenacin por seleccin se basan en dos principios:

Seleccionar el elemento ms pequeo del arreglo.

Colocarlo en la posicin ms baja del arreglo

44 de 120
Primer Semestre

Por ejemplo, consideremos el siguiente arreglo con n = 10 elementos no ordenados:


14, 03, 22, 09, 10, 14, 02, 07, 25 y 06
El primer paso de seleccin identifica al 2 como valor mnimo, lo saca
de dicha lista y lo agrega como primer elemento a una nueva lista
ordenada:
Elementos restantes

Lista

no ordenados

ordenada

14, 03, 22, 09, 10,

02

14, 07, 25, 06


En el segundo paso, reconoce al 3 como el siguiente elemento mnimo
y lo retira de la lista para incluirlo en la nueva lista ordenada:
Elementos restantes no

Lista

ordenados

ordenada

14, 22, 09, 10, 14, 07, 25,

02, 03

06
Despus del sexto paso, se tiene la siguiente lista:
Elementos restantes no

Lista ordenada

ordenados
14, 22, 14, 25

02, 03, 06, 07,


09,10

El nmero de pasadas o recorridos del arreglo es n-1, pues en la ltima pasada se


colocan los dos ltimos elementos ms grandes en la parte superior del arreglo.
45 de 120
Primer Semestre

Insercin
Consiste en insertar un elemento del vector en la parte izquierda del mismo, que ya se
encuentra ordenada. Este proceso se repite desde el segundo hasta el dcimo
elemento.
Por ejemplo, supngase que se desea ordenar los siguientes nmeros del vector: 9, 3,
4, 7 y 2.
PRIMERA COMPARACIN
Si (valor posicin 1 > valor posicin 2): 9 > 3? Verdadero, intercambiar.
Quedando como 3, 9, 4, 7 y 2

SEGUNDA COMPARACIN
Si (valor posicin 2 > valor posicin 3): 9 > 4? Verdadero, intercambiar.
Quedando como 3, 4, 9, 7 y 2
Si (valor posicin 1 > valor posicin 2): 3 > 4? Falso, no intercambiar.

TERCERA COMPARACIN
Si (valor posicin 3 > valor posicin 4): 9 > 7? Verdadero, intercambiar.
Quedando como 3, 4, 7, 9 y 2
Si (valor posicin 2 > valor posicin 3): 4 > 7? Falso, no intercambiar.

Con esta circunstancia se interrumpen las comparaciones puesto que ya no se realiza


la comparacin de la posicin 2 con la 1: ya estn ordenadas correctamente.

46 de 120
Primer Semestre

La tabla de abajo muestra las diversas secuencias de la lista de nmeros conforme se


van sucediendo las comparaciones e intercambios.
Comparacin
1.
2.
3.
4.

1
3
3
3
2

2
9
4
4
3

3
4
9
7
4

4
7
7
9
7

5
2
2
2
9

Quick Sort
El algoritmo de ordenacin rpida es fruto de la tcnica de solucin de algoritmos divide
y vencers, la cual se basa en la recursin: dividir el problema en subproblemas ms
pequeos, solucionarlos cada uno por separado (aplicando la misma tcnica) y al final
unir todas las soluciones.
Este mtodo supone que se tiene M, el arreglo a ordenar, y N, el nmero de elementos
dentro del arreglo. El ordenamiento se hace a travs de un proceso iterativo. Para cada
paso se escoge un elemento "a" de alguna posicin especfica dentro del arreglo.

Ese elemento "a" es el que se colocar en el lugar que le corresponda. Por


conveniencia, se seleccionar "a" como el primer elemento del arreglo y se proceder a
compararlo con el resto de los elementos del arreglo.
47 de 120
Primer Semestre

Una vez que se termin de comparar "a" con todos los elementos, "a" ya se encuentra
en su lugar. A su izquierda, quedan todos los elementos menores a l; y a su derecha,
todos los mayores.
Como se describe a continuacin, se tienen como parmetros las posiciones del
primero y ltimo elementos del arreglo, en vez de la cantidad N de elementos.
Consideremos a M como un arreglo de N componentes:
Tcnica
Se selecciona arbitrariamente un elemento de M, sea "a" dicho elemento:
a = M[1]
Los elementos restantes se arreglan de tal forma que "a" quede en la posicin j, donde:
1. Los elementos en las posiciones M[j-1] deben ser menores o iguales que "a".
2. Los elementos en las posiciones M[j+1] deben ser mayores o iguales que "a".
3. Se toma el subarreglo izquierdo (los menores de "a") y se aplica el mismo
procedimiento. Se toma el subarreglo derecho (los mayores de "a") y se efecta
el mismo procedimiento. Este proceso se realiza hasta que los subarreglos sean
de un elemento (solucin).
4. Al final, los subarreglos conformarn el arreglo M, el cual contendr elementos
ordenados en forma ascendente.

Shell
A diferencia del algoritmo de ordenacin por insercin, este algoritmo intercambia
elementos distantes. La velocidad del algoritmo depender de una secuencia de

48 de 120
Primer Semestre

valores (incrementos) con los cuales trabaja, utilizndolos como distancias entre
elementos a intercambiar.
Se considera la ordenacin de shell como el algoritmo ms adecuado para ordenar
muchas entradas de datos (decenas de millares de elementos), ya que su velocidad, si
bien no es la mejor de todos los algoritmos, es aceptable en la prctica, y su
implementacin (cdigo) es relativamente sencilla.

49 de 120
Primer Semestre

RESUMEN DE LA UNIDAD
Es fundamental recabar la informacin necesaria para indicar una accin que solucione
un problema en forma adecuada, puesto que permite calcular el rendimiento del
algoritmo a travs de la cantidad de datos a procesar y el tiempo que tarde su
procesamiento.

La compresin de conceptos como computabilidad es muy importante, pues ayuda a


resolver problemas mediante el algoritmo de la mquina de Turing, y ayuda a
interpretar un fenmeno a travs de un cmulo de reglas establecidas.

En cuanto a la recursividad, es cuando una funcin se invoca repetidamente a s misma


hasta encontrar un resultado base, y ste retorna a la funcin que la invoc. A travs
de la induccin, se genera una solucin recursiva que implica la abstraccin, lo que
dificulta la comprensin de su funcionamiento.
En la resolucin de problemas a travs de algoritmos, los mtodos de ordenacin y
bsqueda se utilizan con bastante frecuencia. Ordenar los datos para su mejor
manipulacin facilita la tarea a los usuarios de la informacin, y simplifica su bsqueda
y el acceso a un elemento determinado.

50 de 120
Primer Semestre

BIBLIOGRAFA DE LA UNIDAD

SUGERIDA

Autor

Captulo

Pginas

12. Using Entropy for


Smit y Eiben (2010)

Parameter Analysis od

287-308

Evolutionary Algotithms

51 de 120
Primer Semestre

UNIDAD 3
Diseo de algoritmos para la solucin
de problemas

52 de 120
Primer Semestre

OBJETIVO PARTICULAR
Al terminar la unidad, el alumno podr plantear, desarrollar y seleccionar un algoritmo
determinado para solucionar un problema especfico.

TEMARIO DETALLADO
(12 horas)
3. Diseo de algoritmos para la solucin de problemas
3.1 Niveles de abstraccin para la construccin de algoritmos
3.2 Tcnicas de diseo de algoritmos
3.3. Alternativas de solucin
3.4 Diagramas de flujo

53 de 120
Primer Semestre

INTRODUCCIN
En esta unidad, se describe un mtodo por medio del cual es posible construir
algoritmos para la solucin de problemas, adems de las caractersticas de algunas
estructuras bsicas usadas tpicamente en la implementacin de estas soluciones y las
tcnicas de diseo de algoritmos.
En la construccin de algoritmos, se debe considerar el anlisis del problema para
hacer una abstraccin de las caractersticas de ste, el diseo de una solucin basada
en modelos y, por ltimo, la implementacin del algoritmo a travs de la escritura del
cdigo fuente, con la sintaxis de algn lenguaje de programacin.
Todo algoritmo tiene estructuras bsicas presentes en el modelado de soluciones. En
este material de estudio se abordan las siguientes: ciclos, contadores, acumuladores,
condicionales y rutinas recursivas.
Tambin se analizan las diferentes tcnicas de diseo de algoritmos para construir
soluciones que satisfagan los requerimientos de los problemas, entre las que destacan
las siguientes.
ALGORITMOS VORACES
Son utilizados para la solucin de problemas de optimizacin; fciles de disear y
eficientes al encontrar una solucin rpida al problema.

54 de 120
Primer Semestre

DIVIDE Y VENCERS
Fragmentan el problema en forma recursiva y solucionan cada subproblema; y la
suma de estas soluciones es la solucin del problema general

PROGRAMACIN DINMICA
Define subproblemas superpuestos y subestructuras ptimas; busca soluciones
ptimas del problema en su conjunto.
VUELTA ATRS (BACKTRACKING)
Encuentra soluciones a problemas que satisfacen restricciones. Va creando todas
las posibles combinaciones de elementos para obtener una solucin.

RAMIFICACIN Y PODA
Halla soluciones parciales en un rbol en expansin de nodos, utiliza diversas
estrategias (LIFO, FIFO y LC) para encontrar las soluciones y contiene una
funcin de costo que evala si las soluciones identificadas mejoran la solucin
actual; en caso contrario, poda el rbol para no continuar buscando en esa rama.
Los nodos pueden trabajar en paralelo con varias funciones a la vez, lo cual
mejora su eficiencia; aunque en general requiere ms recursos de memoria.

55 de 120
Primer Semestre

3.1. Niveles de abstraccin para la


construccin de algoritmos
La construccin de algoritmos se basa en la abstraccin de las caractersticas del
problema, a travs de un proceso de anlisis que permitir seguir con el diseo de una
solucin fundamentada en modelos, los cuales ven su representacin tangible en el
proceso de implementacin del algoritmo.

ANLISIS
Consiste en reconocer cada una de las caractersticas del problema, lo cual se logra
sealando los procesos y variables que lo rodean.
Los procesos pueden identificarse como operaciones que se aplican a las variables del
problema. Al analizar sus procesos o funciones, stos deben relacionarse con sus
variables. El resultado esperado de esta fase de la construccin de un algoritmo es un
modelo

que

represente

la

problemtica

encontrada

permita

identificar

sus

caractersticas ms relevantes.
DISEO
Una vez que se han analizado las causas del problema e identificado el punto exacto
donde radica y sobre el cual se debe actuar para llegar a una solucin, comienza el
proceso de modelado de una solucin factible, es decir, el diseo. En esta etapa se debe
estudiar el modelo del problema, elaborar hiptesis acerca de posibles soluciones y
comenzar a realizar pruebas con stas.

IMPLEMETACIN
Por ltimo, ya que se tiene modelada la solucin, sta debe implementarse usando el
lenguaje de programacin ms adecuado.

56 de 120
Primer Semestre

Estructuras bsicas en un algoritmo


En el modelado de soluciones mediante el uso de algoritmos, es comn encontrar
ciertos comportamientos clsicos que tienen una representacin a travs de modelos
ya definidos. A continuacin se explican sus caractersticas.
Ciclos
Son estructuras que se caracterizan por iterar instrucciones en funcin de una
condicin que debe cumplirse en un momento bien definido.
Existen dos tipos de ciclos, puntualizados en el siguiente cuadro.
Mientras

Hasta que

Se caracteriza por realizar la verificacin de Evala


la

condicin

antes

de

ejecutar

la

condicin

despus

de

las ejecutar las instrucciones una vez.

instrucciones asociadas al ciclo.

Las instrucciones definidas dentro de ambos ciclos deben modificar en algn punto la
condicin para que sea alcanzable; de otra manera, seran ciclos infinitos, un error de
programacin comn.

En este tipo de ciclos, el nmero de iteraciones que se realizarn es variable y depende


del contexto de ejecucin del algoritmo.

57 de 120
Primer Semestre

El ciclo MIENTRAS tiene el siguiente pseudocdigo:

mientras <condicin> hacer


Instruccion1
Instruccion2
...
Instruccin n
fin mientras

El diagrama asociado a este tipo de ciclo es:

58 de 120
Primer Semestre

Ejemplo del uso de la instruccin mientras:

n=0 (se inicializa el contador)

suma=0 (se inicializa la variable suma)

Mientras n=5 hacer (condicin)

Suma=suma+n

n=n+1

fin mientras

Por otro lado, el pseudocdigo asociado a la instruccin hasta que, se define como
sigue:

hacer
Instruccion1
Instruccion2
...
Instruccin n
Hasta que <condicin>
Su diagrama se puede representar como:

59 de 120
Primer Semestre

Ahora, se utilizar el ejemplo anterior implementado con la funcin hasta que:

n=0 (se inicializa el contador)

suma=0 (se inicializa la variable suma)

hacer

Suma=suma+n

n=n+1

hasta que n=5 (condicin)

Cabe mencionar que las instrucciones contenidas en la estructura mientras se siguen


ejecutando cuando la condicin resulte verdadera. En cambio, hasta que continuar
iterando siempre que la evaluacin de la condicin resulte falsa.
Cuando el pseudocdigo se transforma al cdigo fuente de un lenguaje de
programacin, se presenta el problema en la estructura, mientras no est delimitada al
final de sta con un comando de algn lenguaje de programacin, por lo que se tiene
que cerrar con una llave, parntesis o un End; en tanto, la segunda estructura est
acotada por un comando tanto al inicio como al final de la misma.
Contadores
Este tipo de estructura tambin se caracteriza por iterar instrucciones en funcin de una
condicin que debe cumplirse en un momento conocido, y est representada por la
instruccin para (for). En esta estructura se evala el valor de una variable a la que se
asigna un valor conocido al inicio de las iteraciones; este valor sufre incrementos o
decrementos en cada iteracin, y suspende la ejecucin de las instrucciones asociadas
una vez que se alcanza el valor esperado.
En algunos lenguajes, se puede definir el incremento que tendr la variable; sin
embargo, se recomienda que el incremento siempre sea con la unidad.
Pseudocdigo que representa la estructura:
60 de 120
Primer Semestre

Para <variable> = <valor inicial> hasta <valor


tope> [paso <incremento>] hacer
Instruccion1
Instruccion2
...
Instruccin n
Fin para <variable>

Se ha podido observar entre los smbolos [ ] la opcin que existe para efectuar el
incremento a la variable con un valor distinto de la unidad.
A continuacin, se muestra el diagrama asociado a esta estructura:

61 de 120
Primer Semestre

Utilizaremos el ejemplo anterior implementado con la funcin for:

suma=0 (inicializamos la variable suma)

para n=0 hasta n=5 , [n+1] hacer (indicamos que comenzaremos en n=0 y
repetiremos hasta que n alcance el valor de 5, con un incremento del valor de n
en 1)

Suma=suma+n

fin para n

Acumuladores
Los acumuladores son variables que tienen como propsito almacenar valores
incrementales o decrementales a lo largo de la ejecucin del algoritmo; y utilizan la
asignacin recursiva de valores para no perder su valor anterior.
Su misin es arrastrar un valor que se va modificando con la aplicacin de diversas
operaciones y cuyos valores intermedios, as como el final, son importantes para el
resultado global del algoritmo. Este tipo de variables generalmente almacena el valor
de la solucin arrojada por el algoritmo.
La asignacin recursiva de valor a este tipo de variables se ejemplifica a continuacin:

<variable> = <variable> +
<incremento>

En los ejemplos anteriores podemos observar el uso de los acumuladores en la


variable n.

Condicionales
62 de 120
Primer Semestre

Esta clase de estructura se utiliza para ejecutar selectivamente secciones de cdigo de


acuerdo con una condicin definida. Y slo tiene dos opciones: si la condicin se
cumple, se ejecuta una seccin de cdigo; si no, se ejecuta otra seccin, aunque esta
parte puede omitirse.
Es importante mencionar que se pueden anidar tantas condiciones como lo permita el
lenguaje de programacin en el que se implemente el programa.
El pseudocdigo bsico que representa la estructura if es el siguiente:

si <condicin> entonces
Instruccion1
Instruccin n
[si no
Instruccin 3
Instruccin n]
Fin si

Dentro del bloque de instrucciones que se definen en las opciones de la estructura, s


se pueden insertar otras estructuras condicionales anidadas. Entre los smbolos [ ] se
encuentra la parte opcional de la estructura.
El diagrama asociado a esta estructura se muestra a continuacin:

Ahora, se emplear la estructura if para solucionar el mismo ejemplo que se ha estado


manejando.
63 de 120
Primer Semestre

suma=0 (inicializamos la variable suma)

n=0 (inicializamos el acumulador)

si n=5 entonces (establecemos la condicin)

imprime suma

de lo contrario (establecemos la alternativa de la condicin)

Suma=suma+n

n=n+1

fin si

En este caso, la condicin se cumplir hasta que n alcance el valor de 5; mientras no lo


haga, realizar la suma de los valores hasta alcanzar la condicin.
Rutinas recursivas
Son las que hacen llamadas a s mismas en su definicin, simplificando los valores
originales de entrada. Se implementan en los casos en que el problema a resolver
puede simplificarse en versiones ms pequeas del mismo problema, hasta llegar a
casos simples de fcil resolucin.
Las rutinas recursivas regularmente contienen una clusula condicional (SI) que
permite diferenciar entre el caso base, situacin final en que se regresa un valor como
resultado de la rutina, o bien, un caso intermedio, cuando se invoca la rutina a s misma
con valores simplificados.

64 de 120
Primer Semestre

Es importante no confundir una rutina recursiva con una cclica, por ello se muestra a
continuacin el pseudocdigo genrico de una rutina recursiva:

<valor_retorno>
Nombre_Funcion (<parmetro
a> [,<parmetro b> ...])
si <caso_base> entonces
retorna <valor_retorno>
si no
Nombre_Funcion ( <parmetro
a -1> [, <parmetro b -1> ...] )
Fin si

Como se observa en el ejemplo, en esta rutina es obligatoria la existencia de un valor


de retorno, una estructura condicional y al menos un parmetro.
El diagrama asociado a este tipo de rutinas ya se ha ejemplificado en la
figura de funciones recursivas.

65 de 120
Primer Semestre

3.2. Tcnicas de diseo


de algoritmos
Algoritmos voraces
Suelen utilizarse en la solucin de problemas de optimizacin y se distinguen porque
son:

Sencillos. En cuanto a su diseo y codificacin.

Miopes. Toman decisiones con la informacin que tienen disponible de forma


inmediata, sin tener en cuenta sus efectos futuros.

Eficientes. Dan una solucin rpida al problema (aunque sta no sea siempre
la mejor).

Tienen las propiedades siguientes:

Tratan de resolver problemas de forma ptima.

Disponen de un conjunto o lista de candidatos.

A medida que avanza el algoritmo, se acumulan dos conjuntos:

Candidatos considerados y seleccionados.

Candidatos considerados y rechazados.

Existe una funcin que comprueba si un cierto conjunto de candidatos constituye una
solucin del problema, ignorando si por el momento es ptima o no.

66 de 120
Primer Semestre

Otra funcin corrobora si un cierto conjunto de candidatos es factible, esto es, si es


posible o no completar el conjunto aadiendo otros candidatos para obtener al menos
una solucin al problema. Una vez ms, no nos importa si la solucin es ptima o no.
Normalmente se espera que al menos se obtenga una solucin a partir de los candidatos
disponibles inicialmente.
Hay otra funcin de seleccin que indica cul es el ms prometedor de los candidatos
restantes no considerados an.
Adems, implcitamente est presente una funcin objetivo que da el valor a la solucin
que hemos hallado (valor que estamos tratando de optimizar).
Los algoritmos voraces suelen ser bastante simples. Se emplean sobre todo para
resolver problemas de optimizacin. Por ejemplo, encontrar la secuencia ptima para
procesar un conjunto de tareas por una computadora; hallar el camino mnimo de un
grafo, etctera.

67 de 120
Primer Semestre

Por lo regular, intervienen estos elementos:

Un conjunto o lista de candidatos (tareas a procesar, vrtices del grafo,


etctera).

Un conjunto o lista de candidatos (tareas a procesar, vrtices del grafo,


etctera).

Una funcin que determina si un conjunto de candidatos es una solucin al


problema (aunque no tiene por qu ser la ptima).

Una funcin que determina si un conjunto es completable, es decir, si aadiendo


a este conjunto nuevos candidatos es posible alcanzar una solucin al
problema, suponiendo que sta exista.

Una funcin de seleccin que escoge el candidato an no seleccionado que es


ms prometedor.

Una funcin objetivo que da el valor/costo de una solucin (tiempo total del
proceso, longitud del camino, etctera) y es la que se pretende maximizar o
minimizar.

Divide y vencers
Otra tcnica comn en el diseo de algoritmos es divide y vencers, que consta de dos
partes:

Dividir. Los problemas ms pequeos se resuelven recursivamente (excepto,


por supuesto, los casos base).

Vencer. La solucin del problema original se forma, entonces, a partir de las


soluciones de los subproblemas.
68 de 120

Primer Semestre

Las rutinas en las cuales el texto contiene al menos dos llamadas recursivas se
denominan algoritmos de divide y vencers; no as aquellas cuyo texto slo comprende
una.
La idea de la tcnica divide y vencers es dividir un problema en subproblemas del
mismo tipo y, aproximadamente, del mismo tamao; resolver los subproblemas
recursivamente; y combinar la solucin de los subproblemas para dar una solucin al
problema original.
La recursin finaliza cuando el problema es pequeo y la solucin fcil de construir
directamente.

Programacin dinmica
Inventada por el matemtico Richard Bellman en 1953, es un mtodo para reducir el
tiempo de ejecucin de un algoritmo mediante la utilizacin de subproblemas
superpuestos y subestructuras ptimas. Una subestructura ptima significa que
soluciones ptimas de subproblemas pueden ser usadas para encontrar las soluciones
ptimas del problema en su conjunto.
En general, se pueden resolver problemas con subestructuras ptimas siguiendo estos
pasos:
1. Dividir el problema en subproblemas ms pequeos.
2. Resolver estos problemas de la mejor manera usando este proceso de tres
pasos recursivamente.
3. Aplicar estas soluciones ptimas para construir una solucin ptima al problema
original.

69 de 120
Primer Semestre

Los subproblemas se resuelven, a su vez, dividindolos en subproblemas ms


pequeos, hasta alcanzar el caso fcil, donde la
solucin al problema es trivial.
Vuelta atrs (backtracking)
El

trmino

backtrack

fue

acuado

por

el

matemtico estadounidense D. H. Lehmer, en la


dcada de 1950. Es una estrategia para encontrar
soluciones

problemas

que

satisfacen

restricciones.
Los

problemas

que

deben

satisfacer

un

determinado tipo de restricciones son completos,


donde el orden de los elementos de la solucin no
importa. Y consisten en un conjunto o lista de
variables en la que a cada una se le debe asignar
un valor sujeto a las restricciones del problema.
La tcnica va creando todas las combinaciones de elementos posibles para llegar a
una solucin. Su principal virtud es que en la mayora de las implementaciones se
pueden evitar combinaciones estableciendo funciones de acotacin (o poda) y
reduciendo el tiempo de ejecucin.
La vuelta atrs est muy relacionada con la bsqueda combinatoria. La idea es
encontrar la mejor combinacin en un momento determinado, por eso se dice que este
tipo de algoritmo es una bsqueda en profundidad. Si se halla una alternativa
incorrecta, la bsqueda retrocede hasta el paso anterior y toma la siguiente alternativa.
Cuando se han terminado las posibilidades, se vuelve a la eleccin anterior y se toma
la siguiente opcin. Si no hay ms alternativas, la bsqueda falla.

70 de 120
Primer Semestre

Normalmente, se suele implementar este tipo de algoritmos como un procedimiento


recursivo. As, en cada llamada al procedimiento se toma una variable y se le asignan
todos los valores posibles, llamando a su vez al procedimiento para cada uno de los
nuevos estados.
La diferencia con la bsqueda en profundidad es que se suelen disear funciones de
cota, de modo que no se generen algunos estados si no van a conducir a ninguna
solucin, o a una solucin peor de la que ya se tiene. De esta forma se ahorra espacio
en memoria y tiempo de ejecucin.
Es una tcnica de programacin para hacer una bsqueda sistemtica a travs de
todas las configuraciones posibles dentro de un espacio de bsqueda. Para lograrlo,
los algoritmos de tipo backtracking construyen posibles soluciones candidatas de
manera sistemtica. En general, dada una solucin candidata:
1. Verifican si s es solucin. Si lo es, hacen algo con ella (depende del problema).

2. Construyen todas las posibles extensiones de s e invocan recursivamente al


algoritmo con todas ellas.
A veces, los algoritmos backtracking se aprovechan para encontrar una solucin nada
ms, pero otras veces conviene que las revisen todas (por ejemplo, para ubicar la ms
corta).

71 de 120
Primer Semestre

Ramificacin y poda
Esta tcnica de diseo de algoritmos es
similar a la de vuelta atrs y se emplea
regularmente para solucionar problemas de
optimizacin.
La tcnica genera un rbol de expansin de
nodos con soluciones, siguiendo distintas
estrategias: recorrido de anchura (estrategia
LIFO [last input first output] o ltima entrada
primera salida), en profundidad (estrategia
FIFO [first input first output] o primera
entrada primera salida), o empleando el
clculo de funciones de costo para seleccionar el nodo ms prometedor.
Tambin utiliza estrategias para las ramas del rbol que no conducen a la solucin
ptima: calcula en cada nodo una cota del posible valor de aquellas soluciones
alcanzables desde ste. Si la cota muestra que cualquiera de estas soluciones no es
mejor que la hallada hasta el momento, no contina explorando esa rama del rbol, lo
cual permite realizar el proceso de poda.
Se conoce como nodo vivo del rbol al que tiene posibilidades de ser ramificado, es
decir, que no ha sido podado. Para determinar en cada momento qu nodo va a ser
expandido se almacenan todos los nodos vivos en una estructura pila (LIFO) o cola
(FIFO) que podamos recorrer. La estrategia de mnimo costo (LC [low cost]) utiliza una
funcin de costo para decidir en cada momento qu nodo debe explorarse, con la
esperanza de alcanzar pronto la solucin ms econmica que la mejor encontrada
hasta el momento.

72 de 120
Primer Semestre

Este proceso se da en tres etapas:


SELECCIN
Extrae un nodo de entre el conjunto de los nodos vivos.
RAMIFICACIN
Se construyen los posibles nodos hijos del nodo seleccionado en la etapa anterior.
PODA
Se eliminan algunos de los nodos creados en la etapa anterior. Los nodos no
podados pasan a formar parte del conjunto de nodos vivos y se comienza de nuevo
por el proceso de seleccin. El algoritmo finaliza cuando encuentra la solucin, o
bien cuando se agota el conjunto de nodos vivos.

Para cada nodo del rbol dispondremos de una funcin de costo que calcule el valor
ptimo de la solucin si se contina por ese camino. No se puede realizar poda alguna
hasta haber hallado alguna solucin.

Disponer de distintas estrategias de exploracin del rbol y de acotar la bsqueda de la


solucin se traduce en eficiencia. La dificultad est en encontrar una buena funcin de
costo para el problema, buena en el sentido que garantice la poda y su clculo no sea
muy costoso.

Es recomendable no realizar la poda de nodos sin antes conocer el costo de la mejor


solucin ubicada hasta el momento, para evitar expansiones de soluciones parciales a
un costo mayor.

73 de 120
Primer Semestre

Estos algoritmos tienen la posibilidad de ejecutarse en paralelo. Debido a que disponen


de un conjunto de nodos vivos sobre el que se efectan las tres etapas del algoritmo
antes mencionadas, se puede contar con ms de un proceso trabajando sobre este
conjunto, extrayendo nodos, expandindolos y realizando la poda.
Esto explica que los requerimientos de memoria sean mayores que los de los
algoritmos vuelta atrs. El proceso de construccin necesita que cada nodo sea
autnomo en el sentido que ha de contener toda la informacin necesaria para realizar
los procesos de bifurcacin y poda, y reconstruir la solucin encontrada hasta ese
momento.
Un ejemplo de aplicacin de los algoritmos de ramificacin y poda est en el problema
de las N-reinas, el cual consiste en colocar 8 reinas en un tablero de ajedrez cuyo
tamao es de 8 por 8 cuadros. Las reinas deben estar distribuidas dentro del tablero de
modo que no se encuentren dos o ms reinas en la misma lnea horizontal, vertical o
diagonal. Se han encontrado 92 soluciones posibles a este problema.

74 de 120
Primer Semestre

3.3. Alternativas de solucin


El pseudocdigo es la tcnica ms usada para elaborar algoritmos. Se trata de una
imitacin de cdigo. Al igual que el diagrama de flujo, va describiendo la secuencia
lgica de pasos mediante enunciados que deben comenzar con un verbo que indique la
accin a seguir, continuada de una breve descripcin del paso en cuestin.
En caso de usar decisiones, se utilizan sentencias como:

si condicin (relacin boleana)


entonces instrucciones
si no instrucciones
finsi

Si es necesaria una bifurcacin (cambio de flujo a otro punto del algoritmo), se emplean
etiquetas como:

suma 2 y 5
ir a final
(instrucciones)
(instrucciones)
final (etiqueta)

Para conservar la sencillez, se debe usar un lenguaje llano y natural. Despus que se
codifique, cada frase ser una lnea de comando del programa.

75 de 120
Primer Semestre

Las rdenes ms empleadas son hacer-mientras, hacer-hasta, si-entonces-sino, repitemientras. Por ejemplo:

Algoritmo: obtener la suma de los nmeros del 1 al 100


Inicio
asigna a = 0
asigna suma = 0
mientras a <= 100
asigna suma = suma + a
fin-mientras
imprime La suma es: suma
fin

El siguiente paso es la comprobacin, y luego contina la codificacin a un programa


escrito en un lenguaje de programacin.

Diagrama de Nassi/Shneiderman (N/S)


El diagrama estructurado N/S, tambin conocido como diagrama de Chapin, es
parecido a uno de flujo en el que se omiten las flechas de unin y las cajas son
contiguas. Las acciones sucesivas se pueden escribir en cajas sucesivas y, como en
los diagramas de flujo, se anotan diferentes acciones en cada caja. Un algoritmo se
representa en la siguiente forma:

Inicio
Accion1
Accion2
...
Fin

76 de 120
Primer Semestre

A continuacin, se ejemplifica el uso de este tipo de diagrama.


Algoritmo: clculo del salario neto a partir de las horas laboradas, el costo por hora y la
tasa de impuesto del 16% sobre el salario.

Inicio
Leer
Nombre,Hrs,Precio

Calcular
Salario = Hrs * Precio

Calcular
Imp = Salario* 0.16

Calcular
Neto = Salario + Imp

Escribir
Nombre, Imp, SNeto

Fin

77 de 120
Primer Semestre

3.4. Diagramas de flujo


Los diagramas de flujo son la representacin grfica de los algoritmos. Elaborarlos
implica disear un diagrama de bloque que contenga un bosquejo general del
algoritmo, y con base en ste proceder a su ejecucin con todos los detalles
necesarios.

Reglas para construir diagramas de flujo:


1. Debe diagramarse de arriba hacia abajo y de izquierda a derecha. Es una buena
costumbre en la diagramacin que el conjunto de grficos tenga un orden.

2. El diagrama slo tendr un punto de inicio y uno final. Aunque en el flujo lgico
se tomen varios caminos, siempre debe existir una sola salida.

3. Usar notaciones sencillas dentro de los grficos; y si se requieren notas


adicionales, colocarlas en el grfico de anotaciones a su lado.

4. Se deben inicializar todas las variables al principio del diagrama. Esto es muy
recomendable, pues ayuda a recordar todas las variables, constantes y arreglos
que van a ser utilizados en la ejecucin del programa. Adems, nunca sabemos
cundo otra persona modificar el diagrama y necesitar saber de estos datos.

78 de 120
Primer Semestre

5. Procurar no cargar demasiado una pgina con grficos; si es necesario, utilizar


ms hojas, emplear conectores. Cuando los algoritmos son muy grandes, se
pueden utilizar varias hojas para su graficacin, con conectores de hoja para
cada punto en donde se bifurque a otra hoja.

6. Todos los grficos estarn conectados con flechas de flujo. Jams debe dejarse
un grfico sin que tenga alguna salida, a excepcin del que marque el final del
diagrama.

Terminado el diagrama de flujo, se realiza la prueba de escritorio. Es decir, se le da un


seguimiento manual al algoritmo, llevando el control de variables y resultados de
impresin en forma tabular.

Ventajas:
1. Programas bien documentados.
2. Cada grfico se codificar como una instruccin de un
programa realizando una conversin sencilla y eficaz.
3. Facilita la depuracin lgica de errores.
4. Se simplifica su anlisis al facilitar la comprensin de las interrelaciones.
Desventajas:
1. Su elaboracin demanda varias pruebas en borrador.
2. Los programas muy grandes requieren diagramas laboriosos y complejos.
3. Falta de normatividad en su elaboracin, lo que complica su desarrollo.

Algunos grficos usados en los diagramas:


79 de 120
Primer Semestre

SMBOLO

DESCRIPCIN
Terminal. Indica el inicio y el final del
diagrama de flujo.
Entrada/Salida. Marca la entrada y salida
de datos.
Proceso. Seala la asignacin de un valor
en la memoria y/o la ejecucin de una
operacin aritmtica.
Decisin. Simboliza la realizacin de una
comparacin de valores.

Proceso predefinido. Representa los


subprogramas.
Conector

de

pgina.

Indica

la

continuidad del diagrama dentro de la


misma pgina.
Conector

de

hoja.

Representa

la

continuidad del diagrama en otra pgina.


Impresin.

Indica

la

salida

de

informacin por impresora.


Pantalla. Marca la salida de informacin
en el monitor de la computadora.
Flujo. Simbolizan la secuencia en que se
realizan las operaciones.

80 de 120
Primer Semestre

A continuacin se presenta un ejemplo de diagrama de flujo.


Algoritmo: imprimir los factoriales para los nmeros del 1 al 10.

INICIO

N=1

FACT=1

FACT=N*FACT

N, FACT

No
N =10

N=N+1

Si
FINAL
Puede haber varias soluciones, pero una ser la ptima.

81 de 120
Primer Semestre

RESUMEN
En esta unidad, se analiz un mtodo por medio del cual se pueden construir
algoritmos. Se revisaron las caractersticas de algunas estructuras bsicas usadas
tpicamente en la implementacin de estas soluciones, haciendo una abstraccin de las
caractersticas del problema basada en modelos y aterrizando en la implementacin del
algoritmo a travs de la escritura del cdigo fuente en un lenguaje de programacin.

Las estructuras bsicas de un algoritmo estn presentes en el modelado de soluciones.


En esta unidad, se abordaron estructuras como contadores, acumuladores,
condicionales y rutinas recursivas. Tambin se estudiaron tcnicas de diseo de
algoritmos para construir soluciones que satisfagan los requerimientos de los
problemas, como algoritmos voraces, divide y vencers, programacin dinmica, vuelta
atrs, ramificacin y poda.

Adems, se expuso cmo las soluciones parciales en un rbol en expansin de nodos,


utilizando diversas estrategias (LIFO, FIFO y LC) para encontrar las soluciones,
contienen una funcin de costo que evala si las soluciones halladas mejoran la
solucin actual.

As, se ha mostrado un panorama general de la construccin de algoritmos, sus


estructuras bsicas y tcnicas de diseo.

82 de 120
Primer Semestre

BIBLIOGRAFA DE LA UNIDAD

SUGERIDA

Autor
Duy Ker-I Ko (2012)

Captulo
2. Greedy Strategy

Pginas
35-80

83 de 120
Primer Semestre

UNIDAD 4

Implantacin de algoritmos

84 de 120
Primer Semestre

OBJETIVO PARTICULAR
Al finalizar la unidad, el alumno podr llevar a cabo la realizacin de un programa a
partir de un algoritmo para un problema determinado.

85 de 120
Primer Semestre

TEMARIO DETALLADO
(12 HORAS)
4.El programa como una expresin computable del algoritmo
4.2 Programacin estructurada
4.3 Modularidad
4.4 Funciones, rutinas y procedimientos
4.5 Enfoque de algoritmos

INTRODUCCIN
En esta unidad, se aborda el mtodo para transformar un algoritmo a su expresin
computable: el programa. ste es un conjunto de instrucciones que realizan
determinadas acciones y que estn escritas en un lenguaje de programacin. La labor
de escribir programas se conoce como programacin.
Tambin se estudian las estructuras de control bsicas a las que hace referencia el
teorema de la estructura, que son piezas clave en la programacin estructurada cuya
principal caracterstica es no realizar bifurcaciones lgicas a otro punto del programa
86 de 120
Primer Semestre

(como se haca en la programacin libre), lo cual facilita su seguimiento y


mantenimiento.
Asimismo se analizan los dos enfoques de diseo de sistemas: el refinamiento
progresivo y el procesamiento regresivo, y se comparan sus ventajas y limitaciones.

87 de 120
Primer Semestre

4.1. El programa como una expresin


computable del algoritmo
Como ya se ha mencionado, el algoritmo es una secuencia lgica y detallada de pasos
para solucionar un problema. Una vez diseada la solucin, se implementa mediante
un programa de computadora. El algoritmo debe transformarse, lnea por lnea, a la
sintaxis utilizada por un lenguaje de programacin (el que seleccione el programador).
Se revisa a continuacin la manera como un algoritmo se convierte en un programa de
computadora.

DEFINICIN DEL ALGORITMO


Enunciado del problema para saber qu se espera que haga el programa.

ANLISIS DEL ALGORITMO


Para resolver el problema, debemos estudiar las salidas que se esperan del programa para
definir las entradas requeridas. Tambin se bosquejarn los pasos a seguir por el algoritmo.

SELECCIN DE LA MEJOR ALTERNATIVA


Si hay varias formas de solucionar el problema, se debe escoger la que produzca resultados en
el menor tiempo y con el menor costo posible.

DISEO DE ALGORITMO
Se diagraman los pasos del problema. Tambin se puede utilizar el pseudocdigo como la
descripcin abstracta del problema.

88 de 120
Primer Semestre

PRUEBA DE ESCRITORIO
Cargar datos muestra y seguir la lgica marcada por el diagrama o el pseudocdigo. Comprobar
los resultados para verificar si hay errores.

CODIFICACIN
Traducir cada grfico del diagrama o lnea del pseudocdigo a una instruccin de algn lenguaje
de programacin. El cdigo fuente se guarda en archivo electrnico.

COMPILACIN
El compilador verifica la sintaxis del cdigo fuente en busca de errores, es decir, si se ha escrito
mal algn comando o regla de puntuacin del lenguaje. Se depura y vuelve a compilar hasta que
ya no existan errores de este tipo. El compilador crea un cdigo objeto, el cual lo enlaza con
alguna librera de programas (edicin de enlace) y obtiene un archivo ejecutable.

PRUEBA DEL PROGRAMA


Se ingresan datos muestra para el anlisis de los resultados. Si hay un error, se regresa al paso
6 para revisar el cdigo fuente y depurarlo.
DOCUMENTACIN
El programa libre de errores se documenta con los diagramas utilizados, listado de su cdigo
fuente, diccionario de datos en donde se listan las variables, constantes, arreglos,
abreviaciones, etctera.

Una vez que se produce el archivo ejecutable, el programa se hace independiente del
lenguaje de programacin que se emple para generarlo, por lo que permite su
portabilidad a otro sistema de cmputo. En resumen, el programa es la expresin
computable del algoritmo ya implementado, y puede utilizarse repetidamente en el rea
en donde se produjo el problema.

89 de 120
Primer Semestre

4.2. Programacin estructurada


Al construir un programa con un lenguaje de alto nivel, el control de su ejecucin debe
utilizar nicamente las tres estructuras de control bsicas: secuencia, seleccin e
iteracin. A estos programas se les llama estructurados.
Teorema de la estructura
A finales de la dcada de 1960, surgi un nuevo teorema que indicaba que todo
programa puede escribirse utilizando nicamente las tres estructuras de control
siguientes.
SECUENCIA
Serie de instrucciones que se ejecutan sucesivamente.
SELECCIN
La instruccin condicional alternativa de la forma:
SI condicin ENTONCES
Instrucciones (si la evaluacin de la condicin resulta verdadera)
SI NO
Instrucciones (si la evaluacin de la condicin es falsa)
FIN SI.

ITERACIN
La estructura condicional MIENTRAS, que ejecuta la instruccin repetidamente
siempre y cuando la condicin se cumpla, o tambin la forma HASTA QUE, ejecuta
la instruccin siempre que la condicin sea falsa, o lo que es lo mismo, hasta que la
condicin se cumpla.

Estos tres tipos de estructuras lgicas de control pueden ser combinados para producir
programas que manejen cualquier tarea de procesamiento de datos.

90 de 120
Primer Semestre

La programacin estructurada se basa en el teorema de la estructura, el cual establece


que cualquier programa contiene solamente las estructuras lgicas mencionadas
anteriormente.
Una

caracterstica

importante

en

un

programa

estructurado es que puede ser ledo en secuencia,


desde el comienzo hasta el final, sin perder la
continuidad de la tarea que cumple. Esto es relevante,
pues es mucho ms simple comprender completamente
el trabajo que realiza una funcin determinada si todas las instrucciones que influyen
en su accin estn fsicamente cerca y encerradas por un bloque. La facilidad de
lectura, de comienzo a fin, es una consecuencia de utilizar solamente tres estructuras
de control y eliminar la instruccin de desvo de flujo de control (la antigua instruccin
goto etiqueta).
Ventajas de la programacin estructurada:
Facilita el entendimiento de programas.
Reduce el esfuerzo en las pruebas.
Programas ms sencillos y ms rpidos.
Mayor productividad del programador.
Se facilita la utilizacin de otras tcnicas para el mejoramiento de la productividad en
programacin.
Los programas estructurados estn mejor documentados.
Un programa que es fcil de leer y est compuesto de segmentos bien definidos tiende a
ser simple, rpido y menos expuesto a mantenimiento.

91 de 120
Primer Semestre

Estos beneficios derivan en parte del hecho que, aunque el programa tenga una
extensin significativa, en documentacin tiende siempre a estar al da.
El siguiente programa que imprime una secuencia de la serie de Fibonacci2 de la forma
1, 1, 2, 3, 5, 8, 13, 21, 34, 55 y 89, es un ejemplo de programacin estructurada.
PSEUDOCDIGO

PROGRAMA FUENTE EN
LENGUAJE C.

Inicio
entero x,y,z;
x=1;
y=1
imprimir (x,y);
mientras (x+y<100) hacer
zx+y;
imprimir (z);
xy;
yz;
fin mientras
fin.

#include <stdio.h>
#include <conio.h>
void main(void)
{
int x,y,z;
x=1;
y=1;
printf(%i,%i,x,y);
while (x+y<100) {
z=x+y;
printf(%i,z);
x=y;
y=z;
}
getch();
}

Como se observa en la tabla anterior, las instrucciones del programa se realizan en


secuencia, el programa contiene una estructura mientras que ejecuta el conjunto de
instrucciones contenidas en sta, siempre que se cumpla la condicin que x ms y sea
menor que 100.

En la serie de Fibonacci, el tercer nmero es el resultado de la suma de los dos nmeros anteriores a
ste.
92 de 120
Primer Semestre

4.3. Modularidad
Un problema se puede dividir en subproblemas ms sencillos o mdulos. Dentro de los
programas, se les conoce como subprogramas y presentan dos tipos: procedimientos y
funciones. Ambos reciben datos del programa que los invoca, donde los primeros
devuelven una tarea especfica y las funciones un resultado:
Problema

Subproblema 1

Subproblema 2

Procedimiento

Funciones

Devuelve una tarea

Devuelve un

especfica

resultado

MDULO

En los nuevos lenguajes de programacin, los procedimientos cada vez se utilizan


menos; a diferencia de las funciones, de mayor aplicacin. Un ejemplo de un lenguaje de
programacin construido nicamente por funciones es el lenguaje C.
Ahora, cuando un procedimiento o una funcin se invocan a s mismos
se le llama recursividad.

93 de 120
Primer Semestre

4.4. Funciones, rutinas


y procedimientos
Funcin
Es un conjunto de pasos para realizar clculos especificados y devolver siempre un
resultado. Los pasos estn almacenados con el nombre de funcin, la cual acepta
ciertos valores o argumentos para realizar clculos con stos y proporcionar un
resultado. Hay funciones que carecen de argumentos, pero s arrojan un resultado.
Tanto el resultado de la funcin como los argumentos que recibe deben tener un tipo
de dato previamente definido, por ejemplo, entero, carcter, cadena, fecha, booleano,
etctera.
Una funcin puede invocar a otra e inclusive tener la capacidad de invocarse a s
misma, como las funciones recursivas. La ventaja es que la funcin se puede
implementar e invocar una y repetido nmero de veces.
Un ejemplo de una funcin sera la siguiente, que recibe un valor n y calcula su
factorial:
entero funcin factorial (entero n)
inicio
si (n=0) entonces
factorial=1;
si no
factorial = n* factorial(n-1);
fin si;
retorna factorial
fin funcin
94 de 120
Primer Semestre

Rutina
Es un algoritmo que realiza una tarea especfica y que puede ser invocado desde otro
algoritmo para ejecutar tareas intermedias.Tambin como la funcin, recibe
argumentos y retorna valores. De hecho, la rutina es un tipo muy especfico de una
funcin por lo que se puede considerar sinnimo de sta.
Procedimiento
Es similar a una funcin, pero no regresa un resultado, sino que en su lugar realiza una
o varias tareas, por ejemplo, centrar una cadena en la pantalla de la computadora,
dibujar un marco, imprimir un mensaje etctera.
Ejemplo:

Procedimiento mensajeBienvenida
Inicio
Borrar pantalla
Imprimir Bienvenido al sistema
Imprimir Teclee cualquier tecla para continuar
Salir

Como se observa, el procedimiento realiza las tareas de borrar la pantalla e imprimir un


mensaje de bienvenida, mas no devuelve un valor como resultado (lo que s ocurre en
las funciones).

95 de 120
Primer Semestre

4.5. Enfoque de algoritmos


Existen dos enfoques que se refieren a la forma como se disea un algoritmo:
refinamiento progresivo y procesamiento regresivo.
Refinamiento progresivo
Es una tcnica de anlisis y diseo de algoritmos basada en la divisin del problema
principal en problemas ms simples.
Partiendo de problemas ms sencillos, se logra dar una solucin ms efectiva, ya que
el nmero de variables y casos asociados a un problema simple es ms fcil de
manejar que el problema completo.
Esta tcnica se conoce como top-down (arriba-abajo), y es aplicable a la optimizacin
del desempeo y a la simplificacin de un algoritmo.
Top-down
Conocida tambin como diseo descendente, consiste en establecer una serie de
niveles de mayor a menor complejidad (arriba-abajo) que den solucin al algoritmo.
Se efecta una relacin entre las etapas de la estructuracin, de forma que una etapa
jerrquica y su inmediato inferior se relacionen mediante entradas y salidas de datos.
Se integra de una serie de descomposiciones sucesivas del problema inicial, que recibe
el refinamiento progresivo del repertorio de instrucciones que van a formar parte del
programa.

96 de 120
Primer Semestre

Esta tcnica tiene los siguientes objetivos:

Simplificacin del algoritmo y de los subalgoritmos de cada


descomposicin.

Las diferentes partes del problema pueden ser detalladas de modo


independiente e incluso por diferentes personas (divisin del trabajo).

El programa final queda estructurado en forma de bloque o mdulos, lo que hace


ms sencilla su lectura y mantenimiento (integracin).

Se alcanza el objetivo principal del diseo, ya que se parte de ste y se va


descomponiendo el diseo en partes ms pequeas, pero siempre teniendo en
mente dicho objetivo.

Un ejemplo de un diseo descendente est representado en este sistema de nmina.


Como se puede observar, en este caso, el diseo descendente es jerrquico, el mdulo
0 de nmina contendr el men principal que integrar al sistema, controlando desde
ste los submens del siguiente nivel.

El mdulo 1 de empleados comprender un submen con las opciones de altas,


bajas y los cambios a los registros de los empleados.

En el mdulo 2, se capturarn los movimientos quincenales de la nmina como


los das trabajados, horas extra, faltas, incapacidades de los empleados,
etctera.

En el mdulo 3, se realizarn los clculos de las percepciones, deducciones y el


total de la nmina, individualizado por trabajador.

El men de reportes con el nmero 4 comprender los subprogramas para


consultar en pantalla e imprimir los recibos de nmina, la nmina misma y un
catlogo de empleados, aunque no es limitativo, puesto que se le pueden incluir
ms reportes o informes al sistema reportes correspondientes. As, tenindolo
en mente, se fue descomponiendo en los distintos mdulos y submdulos que
conforman al sistema.
97 de 120

Primer Semestre

Procesamiento regresivo
Es otra tcnica de anlisis y diseo de algoritmos. Parte de la existencia de mltiples
problemas y se enfoca en la asociacin e identificacin de caractersticas comunes
entre ellos, para disear un modelo que represente la solucin para todos los casos, de
acuerdo con ciertos rasgos especficos de las entradas.
Esta tcnica tambin es conocida como bottom-up (abajo-arriba), aunque suele pasar
que no alcance la integracin ptima y eficiente de las soluciones de los diversos
problemas.
Bottom-up
Es el diseo ascendente referido a la identificacin de aquellos subalgoritmos que
necesitan computarizarse conforme vayan apareciendo, su anlisis y su codificacin,
para satisfacer el problema inmediato.
Cuando la programacin se realiza internamente y con enfoque ascendente, es difcil
llegar a integrar los subalgoritmos a tal grado que el desempeo global sea fluido. Los
problemas de integracin entre los subalgoritmos no se solucionan hasta que la
programacin alcanza la fecha lmite para la integracin total del programa.

98 de 120
Primer Semestre

Aunque cada subalgoritmo parece ofrecer lo que se requiere, cuando se considera el


programa final, ste presenta ciertas limitaciones por haber tomado un enfoque
ascendente:

Hay duplicacin de esfuerzos al introducir los datos.

Se incorporan al sistema muchos datos carentes de valor.

El objetivo del algoritmo no fue completamente considerado y, en consecuencia,


no se satisface plenamente.

A diferencia del diseo descendente, en donde s se alcanza la integracin


ptima de todos los mdulos del sistema que lo conforman, en el diseo
ascendente no se llega a este grado de integracin, por lo que muchas tareas
tendrn que llevarse a cabo fuera del sistema con el consiguiente retraso de
tiempo, redundancia de informacin, mayor posibilidad de errores, etctera.

El beneficio del diseo ascendente es que su desarrollo es mucho ms econmico que


el descendente, pero habra que ponderar la bondad de esta ventaja comparada con la
eficiencia en la obtencin de los resultados que ofrezca el sistema ya terminado.

99 de 120
Primer Semestre

RESUMEN
En esta unidad, se estudi el programa, entendido como un conjunto de instrucciones
que realizan acciones especficas escritas en un lenguaje de programacin. De aqu la
importancia de analizar el mtodo para transformar un algoritmo a su expresin
computable, el programa.

Se abordaron, adems, las estructuras de control bsicas referidas al teorema de la


estructura, fundamentales en la programacin estructurada que, a diferencia de la
programacin libre, no realiza bifurcaciones lgicas a otro punto, lo cual facilita su
seguimiento y mantenimiento.

100 de 120
Primer Semestre

BIBLIOGRAFA DE LA UNIDAD

SUGERIDA

Autor

Captulo

Pginas

Gagliolo y Lengrand (2010)

161-184

101 de 120
Primer Semestre

UNIDAD 5

Evaluacin de algoritmos

102 de 120
Primer Semestre

OBJETIVO PARTICULAR
Al finalizar la unidad, el alumno podr identificar el algoritmo que solucione ms
eficientemente al problema en cuestin, documentarlo en futuras revisiones y llevar a efecto
el mantenimiento preventivo, correctivo y adaptativo para su ptima operacin.

TEMARIO DETALLADO
(16 horas)

5.Refinamiento progresivo
5.2 Depuracin y prueba
5.3 Documentacin del programa
5.4 Mantenimiento de programas

103 de 120
Primer Semestre

INTRODUCCIN
La evaluacin de algoritmos es un proceso de anlisis de su desempeo en el
tiempo de ejecucin que tardan para encontrar una solucin, y la cantidad de
recursos empleados para ello. Entre las tcnicas ms confiables para esto se
encuentran aquellas que miden la complejidad de algoritmos a travs de funciones
matemticas.
En esta unidad, se estudia la depuracin y prueba de programas, con el fin de
asegurar que estn libres de errores y cumplan eficazmente con el objetivo para el
que fueron elaborados.
Es necesario documentar lo mejor posible los programas para que tanto analistas
como programadores conozcan lo que hacen estos programas, y dejar una evidencia
de todas sus especificaciones.
Adems, los programas deben ser depurados para que cumplan de manera precisa
su objetivo, por lo que se les dar un mantenimiento adecuado. En este orden,
tambin se profundiza en los tipos de mantenimiento preventivo, correctivo y
adaptativo.

104 de 120
Primer Semestre

5.1. Refinamiento progresivo


En la unidad anterior, se abord el tema de refinamiento progresivo, que es la
descomposicin de un problema en n problemas para facilitar su solucin, y al
final integrarlos en una solucin global. Lo que corresponde ahora es analizar la
evaluacin de los algoritmos con el fin de medir su eficiencia.

La evaluacin de un algoritmo tiene como propsito medir su desempeo,


considerando el tiempo de ejecucin y los recursos empleados (memoria de la
computadora) para obtener una solucin satisfactoria.

En muchas ocasiones, se le da mayor peso al tiempo que tarda un algoritmo en


resolver un problema.
Para medir el tiempo de ejecucin, el algoritmo se puede transformar a un programa
de computadora. Aqu se involucran otros factores, como el lenguaje de
programacin elegido, sistema operativo empleado, habilidad del programador,
etctera.
Pero tambin hay otra forma, se puede medir el nmero de operaciones que realiza
un algoritmo considerando el tamao de las entradas al mismo (N). Entre ms
grande es la entrada, mayor ser su tiempo de ejecucin.
Tambin se debe tomar en cuenta cmo est el conjunto de datos de entrada con el
que trabajar el algoritmo. Como en los algoritmos de ordenacin, el peor caso es
que las entradas se encuentren totalmente desordenadas; el mejor, que estn
totalmente ordenadas; y en el promedio, que aparezcan parcialmente ordenadas.
Como ejemplo, se exponen a continuacin los algoritmos de ordenacin por
insercin y de ordenacin por seleccin.
105 de 120
Primer Semestre

Ordenacin por insercin


Se trata de ordenar un arreglo formado por n enteros. Para esto el algoritmo de
insercin va intercambiando elementos del arreglo hasta que est ordenado.

procedimiento Ordenacin por Insercin ( var T [ 1


.. n ] )
para i := 2 hasta n hacer
x := T [ i ] ;
j := i - 1 ;
mientras j > 0 y T [ j ] > x hacer
T [ j + 1 ] := T[ j ] ;
j := j - 1
fin mientras ;
T [ j + 1 ] := x
fin para
fin procedimiento

Como se observa, n es una variable o constante global que indica el tamao del
arreglo.

Los resultados obtenidos dependen, en parte, de la inicializacin del arreglo de


datos, que puede ser creciente, decreciente o aleatoria. El peor caso ocurre cuando
el arreglo est inicializado descendentemente. El mejor, si el arreglo est inicializado
ascendentemente (el algoritmo recorre el arreglo hasta el final sin apenas realizar
trabajo, pues ya est ordenado).
Se ha calculado empricamente la complejidad para este algoritmo, y se ha
obtenido una complejidad lineal cuando el arreglo est inicializado en orden
ascendente; y una complejidad cuadrtica O(n2) si el arreglo est inicializado en
orden decreciente, y tambin cuando lo hace aleatoriamente.
106 de 120
Primer Semestre

Ordenacin por seleccin


Se trata de ordenar un arreglo formado por n enteros. Para esto el algoritmo de
seleccin va seleccionando los elementos menores al actual y los intercambia.

procedimiento Ordenacin por Seleccin ( var T [ 1 .. n


])
para i := 1 hasta n - 1 hacer
minj := i ;
minx := T [ i ] ;
para j := i + 1 hasta n hacer
si T [ j ] < minx entonces
minj := j ;
minx := T [ j ]
fin si
fin para ;
T [ minj ] := T [ i ] ;
T [ i ] := minx
fin para
fin procedimiento

Se observa que n es una variable o constante global que indica el tamao del
arreglo.
Al igual que en el caso anterior, los resultados obtenidos dependen de la
inicializacin del arreglo de datos, que puede ser creciente, decreciente o aleatoria:

El peor caso ocurre cuando el arreglo est inicializado descendentemente.

El mejor caso se da tanto para la inicializacin ascendente como para la aleatoria.


En comparacin con la ordenacin por insercin, para este algoritmo de seleccin
los tiempos fluctan mucho menos entre las diferentes inicializaciones del arreglo.
Esto se debe a que en ste se realiza prcticamente el mismo nmero de
operaciones en cualquier inicializacin del arreglo.
107 de 120

Primer Semestre

Se ha calculado empricamente la complejidad para este algoritmo y se ha obtenido


que, para cualquier inicializacin del arreglo de datos, el algoritmo tiene una
complejidad cuadrtica O (n2).

5.2. Depuracin y prueba


Depuracin
Una ancdota sobre el origen de este trmino (del ingls debugging, eliminacin de
bichos) cuenta que en la poca de la primera generacin de computadoras
constituidas por bulbos encontraron una polilla entre los circuitos que era la
responsable de la falla del equipo. De all naci la expresin para indicar que el
equipo o los programas presentan algn problema.
La depuracin, entonces, es el proceso de identificacin y correccin de errores de
programacin. Para depurar el cdigo fuente, el programador se vale de
herramientas de software que le facilitan la localizacin y eliminacin de errores. Los
compiladores son un ejemplo de estas herramientas.

108 de 120
Primer Semestre

Se dice que un programa est depurado si est libre de errores. Cuando se depura
un programa se hace un seguimiento de su funcionamiento y se van analizando los
valores de sus distintas variables, as como los resultados obtenidos de los clculos
del programa.
Una vez depurado el programa, se solucionan los posibles errores encontrados y se
procede a depurar otra vez. Estas acciones se repiten hasta que el programa no
contiene ningn error, tanto en tiempo de programacin como en ejecucin.
Los errores ms sencillos de detectar son de sintaxis, presentes cuando alguna
instruccin est mal escrita o se omiti puntuacin necesaria para el programa.
Existen tambin errores lgicos; en este caso, aunque el programa no contenga fallas
de sintaxis, no realiza el objetivo por el que fue creado. Pueden presentarse
incorrecciones en los valores de las variables, ejecuciones de programa que no
terminan, imprecisiones en los clculos, etctera.
Estos ltimos son los ms difciles de detectar, por lo que se debe realizar un
seguimiento puntual del programa.

Prueba de programas
El propsito de las pruebas es asegurar que el programa produce los resultados definidos
en las especificaciones funcionales. El programador a cargo utilizar los datos de prueba
para comprobar que el programa genera los resultados correctos.
O sea, que se produzca la accin correcta en el caso de datos correctos, o el mensaje de
error; y una accin correcta en el caso de datos incorrectos.
Concluida la programacin, el analista volver a usar los datos de prueba para verificar
que el programa o sistema da los resultados correctos. En esta ocasin, concentrar su
atencin tambin en la interaccin correcta entre los diferentes programas y el
funcionamiento completo del sistema.
109 de 120
Primer Semestre

Verificar lo siguiente:

Todos los registros incluidos en los datos de prueba.

Todos los clculos efectuados por el programa.

Todos los campos del registro cuyo valor determine una accin a seguir dentro de la
lgica del programa.

Todos los campos que el programa actualice.

Los casos en que haya comparacin contra otro archivo.

Todas las condiciones especiales del programa.

Se cotejar la lgica del programa.

5.3. Documentacin
del programa
La documentacin de programas es una extensin de la documentacin del
sistema. El programador convierte las especificaciones de programas en lenguaje
de computadora y debe trabajar conjuntamente con las especificaciones de
programas, y comprobar que el programa cumpla con las mismas.
Cualquier modificacin que surja como resultado de la programacin deber ser
expuesta y aceptada antes de aplicar el cambio.
Nombre del programa (cdigo). Indicar el cdigo que identifica el programa y el
ttulo del mismo
Descripcin. Sealar la funcin que realiza el programa.
Frecuencia de procesamiento. Diaria, semanal, quincenal, mensual, etctera.

110 de 120
Primer Semestre

Fecha de vigencia. Fecha a partir de la cual se comienza a ejecutar en


produccin la versin modificada o desarrollada del programa.
Archivos de entrada.
Lista de archivos de salida. Indicar el nombre, copia y descripcin de los
archivos.
Lista de informes y/o totales de control. Se mostrar el nombre de los
informes y se incluir ejemplo de los informes y/o totales de control producidos
por el programa, utilizando los datos de prueba.
Datos de prueba. Se incluir una copia de los datos usados para prueba.
Mensajes al operador. Pantallas de definicin de todos los mensajes al
operador por consola y las posibles contestaciones, con una breve explicacin
de cada una de ellas.
Datos de control. Para ejecutar el programa (parmetros).
Transacciones.
Nombre del programador. Deber indicar el nombre del programador que
escribi el programa o efectu el cambio, segn sea el caso.
Fecha. Indicar la fecha cuando se escribi el programa o efectu el cambio,
segn sea el caso.
Diccionario de datos. Si aplica, se incluir detalle de las diferentes tablas y
cdigos usados con los valores, explicaciones y empleo en el programa.
Lista de programas. Deber incluir copia de la ltima compilacin del
programa con todas las opciones.

111 de 120
Primer Semestre

5.4. Mantenimiento de programas


Los usuarios de los programas solicitarn los cambios necesarios al rea de
sistemas con el fin de que stos continen operando correctamente. Para ello, se
le debe dar mantenimiento peridicamente a los programas.

El mantenimiento presenta las modalidades descritas a continuacin.

PREVENTIVO
Cuando los programas no presentan errores, pero hay necesidad de
regenerar los ndices de los registros, realizar respaldos, verificar la
integridad de los programas, actualizar porcentajes y tablas de datos,
etctera.
CORRECTIVO
Los programas presentan algn error en algn reporte, por lo que es
necesario revisar la codificacin para depurarlos y compilarlos. Se
deben realizar las pruebas al sistema, imprimiendo los reportes que
generan y verificar si los clculos que stos ofrecen son correctos.
ADAPTATIVO
Los programas no tienen errores, mas se requiere alguna actualizacin
por una nueva versin del programa, una nueva plataforma de sistema
operativo o un nuevo equipo de cmputo con ciertas caractersticas. Es
decir, hay que adaptar los programas a la nueva tecnologa tanto de
software como de hardware.

En cualquier caso, el usuario debe realizar la solicitud formal por escrito


puntualizando el tipo de mantenimiento que requiere, y remitirla al rea de sistema
para su revisin y valoracin. En tanto, el personal del rea de sistemas har una
orden de trabajo para proceder a realizar el servicio pedido.

112 de 120
Primer Semestre

RESUMEN
En esta unidad, se revis la evaluacin de algoritmos como un proceso de anlisis
de desempeo del tiempo de ejecucin para encontrar una solucin, y la cantidad de
recursos empleados para ello. Se estudi tambin la importancia de la depuracin y
prueba de programas con el fin de asegurar que estn libres de errores y cumplan
eficazmente con el objetivo para el que fueron elaborados.

De igual manera, se subray la relevancia de la documentacin de los programas


para que tanto analistas como programadores conozcan su dinmica y el fin para los
que fueron creados, y tengan un archivo con sus especificaciones. Adems, se
expuso el tema del mantenimiento, especficamente preventivo, correctivo y
adaptativo, fundamentales para el buen funcionamiento y operacin de un algoritmo.

113 de 120
Primer Semestre

BIBLIOGRAFA DE LA UNIDAD

SUGERIDA

Autor

Captulo

Pginas

Diniz (2008)

6. Data-selective filtering

231-287

REFERENCIA BIBLIOGRFICA
BSICA
114 de 120
Primer Semestre

Bataller, Jordi y Rafael, Magdalena. (2004). Programacin en C. Madrid: Alfaomega / UPV.


Cair Batistutti, Osvaldo. (2002). Metodologa de la programacin: algoritmos, diagramas de
flujo y programas. Mxico: Alfaomega.
Ceballos, Francisco J. (2004). Microsoft visual C++. Aplicaciones para Win 32. (2 ed.)
Mxico: Alfaomega / Ra-Ma.
-----------. (2004a). Enciclopedia del lenguaje C. Mxico: Alfaomega / Ra-Ma.
-----------. (2004b). Enciclopedia del lenguaje C++. Mxico: Alfaomega / Ra-Ma.
-----------. (2004c). Java 2, curso de programacin. Mxico: Alfaomega / Ra-Ma.
-----------. (2004d). El lenguaje de programacin C#. Mxico: Alfaomega / Ra-Ma.
Flores Rueda, Roberto. (2005). Algoritmos, estructuras de datos y programacin orientada
objetos. Bogot: ECOE.
Garca, Luis; Cuadrado, Juan; Amescua, Antonio de y Velasco, Manuel. (2004).
Construccin lgica de programas, teoras y problemas resueltos. Mxico: Alfaomega /
Ra-Ma.
Lpez, Leobardo. (2004). Programacin estructurada: un enfoque algortmico. (2 ed.)
Mxico: Alfaomega.
Pealosa, Ernesto. (2004). Fundamentos de programacin C/C++. (4 ed.) Mxico:
Alfaomega / Ra-Ma.

115 de 120
Primer Semestre

COMPLEMENTARIA
Cair Battistutti, Osvlado. (2006). Fundamentos de programacin: piensa en C. Mxico:
Pearson Educacin.

Garca Prez, J. Baltasar y Laza Fidalgo, Rosala. (2008). Metodologa y tecnologa de la


programacin. Madrid: Pearson Prentice Hall.

Rodrguez, Carlos G. (2003). Ejercicios de programacin creativos y recreativos en C++.


Mxico: Thompson.

Van Gelder, Baase. (2003). Algoritmos computacionales. (3 ed.) Mxico: Thompson.

116 de 120
Primer Semestre

BIBLIOGRAFA ELECTRNICA
(Nota: todos los enlaces, consultados o recuperados, funcionan al 18/09/13
[dd/mm/aa])
Libros
Fuente

Captulos (s)

Liga

Unidad (es) que soporta


Ahn, Chang Wook. (2006).
Advances in evolutionary
algorithms: theory, design
and practice. Berln,
Heidelberg: Springer.
Axelson-Fisk, Marina.
(2010). Implementation of a
Comparative Gene Finder.
En: Comparative gene
finding: models, algorithms
and implementation.
Londres: Springer.
Du, Ding-Zhu; Ker-I ,Ko &
Xiaodong, Hu. (2012).
"Restriction". En: Design
and analysis of
approximation algorithms.
NY: Springer.
Fuchs, Fabian; Vlker,
Markus y Wagner,
Dorothea. (2012).
Simulation-Based Analysis
of Topology Control
Algorithms for Wireless Ad
Hoc Networks. En: Design
and Analysis of Algorithms.
Lecture Notes in Computer
Science. 7659, 188-202.
Gaydecki, Patrick. (2004).
Foundations of digital signal
processing: theory,
algorithms and hardware
design. Londres: Institution
of Electrical Engineers.

Captulo 2 (U,3)

http://link.springer.com/book/10.1007/
3-540-31759-7/page/1

Texto completo (U,3)

http://link.springer.com/chapter/10.10
07/978-1-84996-104-2_7

Texto completo (U, 3 y 4)

http://link.springer.com/book/10.1007/
978-1-4614-1701-9/page/1

Texto completo (U, 2)

http://link.springer.com/chapter/10.10
07/978-3-642-34862-4_14#page-1

Captulo 1 (U, 1)

http://digitallibrary.theiet.org/content/books/cs/pb
cs015e

117 de 120
Primer Semestre

Ghosh, Sumit. (2004).


Algorithm design for
networked information
technology systems. NY:
Springer Verlag.
Gagliolo, Matteo y Legrand,
Catherine. "Algorithm
Survival Analysis". En:
Thomas Bartz-Beielstein.
(2010). Experimental
methods for the analysis of
optimization algorithms.
Berln: Springer.
Hopcroft, John E.; Motwani,
Rajeevy y Ullman, Jeffrey
D. (2009). Introduccin a la
teora de autmatas,
lenguajes y computacin.
(3a ed.) Mxico: Pearson.
Lee, Kang Seok. (2009).
"Standard Harmony Search
Algorithm for Structural
Design Optimization". En:
Zong Woo Geem. (Ed.)
Harmony search algorithms
for structural design
optimization. Berlin:
Springer.
Lee, RCT y otros. (2007).
Introduccin al diseo y
anlisis de algoritmos: un
enfoque estratgico.
Mxico: McGraw-Hill.
Landau, Yoan D. (2011).
Adaptive control:
algorithms, analysis and
applications. (2a ed.)
Londres: Springer
Magouls, F. (2010).
Fundamentals of grid
computing: theory,
algorithms and
technologies. Boca Raton,
Florida: CRC Press.

Captulo 1, 2 y 3 (U,1)

http://ehis.ebscohost.com/ehost/eboo
kviewer/ebook/nlebk_108086_AN?sid
=83214e9a-9ba4-4df6-9f30b696cfd62487@sessionmgr198&vid=
1&format=EB&lpid=lp_III

Captulo 7 (U, 4)

http://link.springer.com/chapter/
10.1007/978-3-642-02538-9_7

Captulo 8 (U,1)

http://unam.libri.mx/libro.php?libroId=
59#

Texto completo (U,2)

http://link.springer.com/chapter/10.10
07/978-3-642-03450-3_1

Captulo 1 (U,4)

http://unam.libri.mx/libro.php?libroId=
125

Captulo 2 (U,2)

http://link.springer.com/book/10.1007/
978-0-85729-664-1/page/1

Captulo 9 (U,2 y 3)

http://www.netLibrary.com/urlapi.asp?
action=summary&v=1&bookid=33899
7

118 de 120
Primer Semestre

Markovsky. Ivan. (2012).


"Algorithms". En: Ivan
Markovsky. Low rank
approximation: algorithms,
implementation,
applications. Londres:
Springer.
Norton, Peter. (2006).
Introduccin a la
computacin. (3a ed.)
Mxico: McGraw-Hill.
Skiana, Steven S. (2008).
The algorith design
manaual. (2a ed.) Londres:
Springer / Verlag.
Tempo, Roberto; Dabbene,
Fabrizio y Calafiore,
Giuseppe. (2005).
Applications of Randomized
Algorithms. En:
Randomized Algorithms for
Analysis and Control of
Uncertain Systems. (2nd
ed.) Londres: Springer.
Verma, Rakesh M. y
Reyner, Steve. (1989). An
Analysis of a Good
Algorithm for the Subtree
Problem, Corrected. En:
SIAM J. Comput, 8(5), 906
908.
Verma, Rakesh M. (1997).
General Techniques for
Analyzing Recursive
Algorithms with
Applications. SIAM Journal
Comput. 26(2), 568581.

Texto completo (U,4)

http://link.springer.com/chapter/10.10
07/978-1-4471-2227-2_3

Captulo 13 (U, 1 y 2)

http://unam.libri.mx/libro.php?libroId=
123

Captulo 2 (U,2)

http://link.springer.com/chapter/10.10
07/978-1-84800-070-4_2#page-1

Captulo 20 (U,1)

http://link.springer.com/chapter/10.10
07/978-1-4471-4610-0_19

Texto completo (U,2)

http://epubs.siam.org/doi/abs/10.1137
/0218062

Texto completo (U,2)

http://epubs.siam.org/doi/abs/10.1137
/S0097539792240583

119 de 120
Primer Semestre

120 de 120
Primer Semestre

Вам также может понравиться