Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Marco Terico
Un algoritmo es una serie de pasos organizados que describe el proceso que se debe seguir, para
dar solucin a un problema especfico.
TIPOS DE ALGORITMOS?
Lenguajes Algortmicos
Un Lenguaje algortmico es una serie de smbolos y reglas que se utilizan para describir de manera
explcita un proceso.
4
No Grficos: Representa en forma descriptiva las operaciones que debe realizar un algoritmo
(pseudocodigo).
INICIO
Edad: Entero
ESCRIBA cul es tu edad?
Lea Edad
SI Edad >=18 entonces
ESCRIBA Eres mayor de Edad
FINSI
ESCRIBA fin del algoritmo
FIN
El computador es una mquina que por s sola no puede hacer nada, necesita ser programada, es
decir, introducirle instrucciones u rdenes que le digan lo que tiene que hacer. Un programa es la
solucin a un problema inicial, as que todo comienza all: en el Problema. El proceso de
programacin es el siguiente: Dado un determinado problema el programador debe idear una solucin
y expresarla usando un algoritmo (aqu es donde entra a jugar); luego de esto, debe codificarlo en un
determinado lenguaje de programacin y por ltimo ejecutar el programa en el computador el cual
refleja una solucin al problema inicial. Esto es a grandes rasgos lo que hace el programador de
computadores.
La parte que corresponde a este manual es la de: Dado un determinado problema debemos idear una
solucin y expresarla usando un ALGORITMO!
5
Metodologa para la solucin de problemas por medio de computadora
Esta fase est dada por el enunciado del problema, el cual requiere una definicin clara y precisa.
Es importante que se conozca lo que se desea que realice la computadora; mientras esto no se
conozca del todo no tiene mucho caso continuar con la siguiente etapa.
Se denomina prueba de escritorio a la comprobacin que se hace de un algoritmo para saber si est
bien hecho. Esta prueba consiste en tomar datos especficos como entrada y seguir la secuencia
indicada en el algoritmo hasta obtener un resultado, el anlisis de estos resultados indicar si el
algoritmo est correcto o si por el contrario hay necesidad de corregirlo o hacerle ajustes.
Los algoritmos conforman un conjunto de pasos que permiten llegar a la solucin del problema. Son
por naturaleza secuenciales, aunque varias tcnicas y herramientas aplicables a ellos ofrecen
mecanismos de repeticin. Son herramientas que tomamos prestadas de las matemticas para poder
dar soluciones computacionales a problemas cotidianos. En la prctica la solucin de un problema no
6
est compuesta por uno, sino por muchos algoritmos, cada uno encargado de resolver una porcin
del problema planteado.
Tiempo secuencial. Un algoritmo funciona en tiempo discretizado paso a paso, definiendo as una
secuencia de estados "computacionales" por cada entrada vlida (la entrada son los datos que se le
suministran al algoritmo antes de comenzar).
Estado abstracto. Cada estado computacional puede ser descrito formalmente utilizando
una estructura de primer orden y cada algoritmo es independiente de su implementacin (los
algoritmos son objetos abstractos) de manera que en un algoritmo las estructuras de primer orden
son invariantes bajo isomorfismo.
Robustez: Un algoritmo debe cubrir todos los casos posibles de acuerdo a las alternativas de
seleccin. Debe funcionar para todos los casos esperados y no esperados.
7
Los algoritmos pueden ser expresados de muchas maneras, incluyendo allenguaje
natural, pseudocdigo, diagramas de flujo y lenguajes de programacin entre otros. Las descripciones
en lenguaje natural tienden a ser ambiguas y extensas. El usar pseudocdigo y diagramas de flujo
evita muchas ambigedades del lenguaje natural. Dichas expresiones son formas ms estructuradas
para representar algoritmos; no obstante, se mantienen independientes de un lenguaje de
programacin especfico.
Diagramas de Flujo:
Los diagramas de flujo son descripciones grficas de algoritmos; usan smbolos conectados con
flechas para indicar la secuencia de instrucciones y estn regidos por ISO.
Los diagramas de flujo son usados para representar algoritmos pequeos, ya que abarcan mucho
espacio y su construccin es laboriosa. Por su facilidad de lectura son usados como introduccin a los
algoritmos, descripcin de un lenguaje y descripcin de procesos a personas ajenas a la
computacin.
Pseudocdigo:
El pseudocdigo (falso lenguaje, el prefijo pseudo significa falso) es una descripcin de alto nivel de
un algoritmo que emplea una mezcla de lenguaje natural con algunas convenciones sintcticas
8
propias de lenguajes de programacin, como asignaciones, ciclos y condicionales, aunque no est
regido por ningn estndar. Es utilizado para describir algoritmos en libros y publicaciones cientficas,
y como producto intermedio durante el desarrollo de un algoritmo, como los diagramas de flujo,
aunque presentan una ventaja importante sobre estos, y es que los algoritmos descritos en
pseudocdigo requieren menos espacio para representar instrucciones complejas.
El pseudocdigo est pensado para facilitar a las personas el entendimiento de un algoritmo, y por lo
tanto puede omitir detalles irrelevantes que son necesarios en una implementacin. Programadores
diferentes suelen utilizar convenciones distintas, que pueden estar basadas en la sintaxis de
lenguajes de programacin concretos. Sin embargo, el pseudocdigo, en general, es comprensible
sin necesidad de conocer o utilizar un entorno de programacin especfico, y es a la vez
suficientemente estructurado para que su implementacin se pueda hacer directamente a partir de l.
As el pseudodocdigo cumple con las funciones antes mencionadas para representar algo abstracto
los protocolos son los lenguajes para la programacin. Busque fuentes ms precisas para tener
mayor comprensin del tema
9
Fases de Desarrollo de un Algoritmo
Enlace: se establece una relacin entre el programa objeto con otras aplicaciones adicionales.
Prueba: se maneja la aplicacin y se revisa si existen errores que incumplan con la robustez y
eficiencia del programa.
ALGORITMO #1
ALGORITMO: Promedio
CONSTANTES: --------------------------------
INICIO
10
ALGORITMO #2
CONSTANTE: ----------------------------------
VARIABLE: Real: P1, P2, P3, Prom., Examen, TrabajoF, Prom. Final
INICIO
ALGORITMO #3
ALGORITMO: Sueldo
DESCRIPCCION: Calcular el sueldo de un empleado dados como datos de entrada: el nombre, hrs.
De trabajo y el pago en hr.
INICIO
11
1. Leer nombre
2. Leer hrs.
3. Sueldo= Pagohr*hrs
4. Escribir Sueldo, nombre
FIN
ALGORITMO #4
ALGORITMO: Evaluacin
Y= 3*X2 + 7X - 15
CONATANTE: ------------------
VARIABLE: Real: X, Y
INICIO
1. Leer X
2. Y= (3*X*X)+(7*x) -15
3. Escribir Y
FIN
ALGORITMO #5
12
ALGORITMO: Sistema de ecuaciones
ax + by= C
dx + dy= f
X= ce bf
ae bd
y= af cd
ae bd
Si ae bd 0
Elabore un algoritmo que lea los coeficientes a, b, c. e, f, y calcule los valores de x,, y.
CONSTANTE: ------------------------
VARIABLE: Real: a, b, c. d, e, f, x, y
INICIO
1. Leer a, b, c, d, e, f
2. x=(c*e) (b*f) /(a*e) (b*d)
3. y=(a*f) (c*d) / (a*e) (b*d)
4. Escribir x, y
FIN
ALGORITMO #6
x x Si x>0
-x Si x <o
CONSTANTES: ----------------------
VARIABLES: Entero: x
13
INICIO
1. Leer x
2. Si (x<0) entonces
X= x*(-1)
Fin_si
3. Escribir x
FIN
CONSTANTE: ---------------------------
VARIABLE: Entero: N
INICIO
1. Leer N
2. Si (N%2=0) entonces
Escribir N en par
Si no Escribir N es impar
Fin _ s
FIN
ALGORITMO #8
ALGORITMO: Nmeros
DESCRIPCCION: Elaborar un algoritmo para leer 3 nmeros y determinar s uno es la suma de los
otros dos.
CONSTANTES: -----------------------------
14
VARIABLES: entero: N1, N2, N3
INICIO
Escribir N2 es la suma de N1 + N3
Fin _ s
Fin _ s
Fin _ s
FIN
ALGORITMO #9
ALGORITMO: Mltiplo de 3
CONSTANTE: -------------------
VARIABLE: Entero: N
INICIO
1. Leer N
15
2. S (N>=100 y N<=200) entonces
S (N%3=0) entonces
Fin _s
Fin _s
FIN
ALGORITMO #10
DESCRIPCCION: Elaborar un algoritmo para leer la fecha de nacimiento de una persona y muestre
su signo zodiacal.
CONTANTES: ------------------
INICIO
1. Leer x, y
2. S (x= marzo y w>= 21) y (x= abril y w<=20) entonces
Escribir Eres Aries
Fin _ s
Fin _ s
Fin _ s
16
S no s (x= junio y w>= 21) y (x= julio y w<= 20) entonces
Fin _ s
Fin _ s
Fin _ s
Fin _ s
Fin _ s
Fin _ s
Fin _ s
Fin _ s
Fin _ s
17
S no Escribir Fecha no reconocida
Fin _s
FIN
Definicin de rbol
Un rbol es una estructura de datos, que puede definirse de forma recursiva como:
Otra definicin nos da el rbol como un tipo de grafo (ver grafos): un rbol es un grafo acclico,
conexo y no dirigido. Es decir, es un grafo no dirigido en el que existe exactamente un camino entre
todo par de nodos. Esta definicin permite implementar un rbol y sus operaciones empleando las
representaciones que se utilizan para los grafos. Sin embargo, en esta seccin no se tratar esta
implementacin.
18
Formas de representacin
- Mediante un grafo:
Figura 1
En la computacin se utiliza mucho una estructura de datos, que son los rboles binarios. Estos
rboles tienen 0, 1 2 descendientes como mximo. El rbol de la figura anterior es un ejemplo vlido
de rbol binario.
Antecesor: un nodo X es es antecesor de un nodo Y si por alguna de las ramas de X se puede llegar
a Y.
Sucesor: un nodo X es sucesor de un nodo Y si por alguna de las ramas de Y se puede llegar a X.
- Grado de un nodo: el nmero de descendientes directos que tiene. Ejemplo: c tiene grado 2, d tiene
grado 0, a tiene grado 2.
- Hoja: nodo que no tiene descendientes: grado 0. Ejemplo: d
- Nodo interno: aquel que tiene al menos un descendiente.
- Nivel: nmero de ramas que hay que recorrer para llegar de la raz a un nodo. Ejemplo: el nivel del
19
nodo a es 1 (es un convenio), el nivel del nodo e es 3.
- Altura: el nivel ms alto del rbol. En el ejemplo de la figura 1 la altura es 3.
- Anchura: es el mayor valor del nmero de nodos que hay en un nivel. En la figura, la anchura es 3.
Aclaraciones: se ha denominado a a la raz, pero se puede observar segn la figura que cualquier
nodo podra ser considerado raz, basta con girar el rbol. Podra determinarse por ejemplo
que b fuera la raz, y a y d los sucesores inmediatos de la raz b. Sin embargo, en las
implementaciones sobre un computador que se realizan a continuacin es necesaria una jerarqua, es
decir, que haya una nica raz.
Se definir el rbol con una clave de tipo entero (puede ser cualquier otra tipo de datos) y dos hijos:
izquierdo (izq) y derecho (der). Para representar los enlaces con los hijos se utilizan punteros. El rbol
vaco se representar con un puntero nulo.
Otras declaraciones tambin aaden un enlace al nodo padre, pero no se estudiarn aqu.
20
- Recorridos en profundidad:
* Recorrido en preorden: consiste en visitar el nodo actual (visitar puede ser simplemente mostrar la
clave del nodo por pantalla), y despus visitar el subrbol izquierdo y una vez visitado, visitar el
subrbol derecho. Es un proceso recursivo por naturaleza.
Si se hace el recorrido en preorden del rbol de la figura 1 las visitas seran en el orden siguiente:
a,b,d,c,e,f.
* Recorrido en inorden u orden central: se visita el subrbol izquierdo, el nodo actual, y despus se
visita el subrbol derecho. En el ejemplo de la figura 1 las visitas seran en este orden: b,d,a,e,c,f.
21
postorden(a->izq);
postorden(a->der);
visitar(a);
}
}
La ventaja del recorrido en postorden es que permite borrar el rbol de forma consistente. Es decir, si
visitar se traduce por borrar el nodo actual, al ejecutar este recorrido se borrar el rbol o subrbol
que se pasa como parmetro. La razn para hacer esto es que no se debe borrar un nodo y despus
sus subrboles, porque al borrarlo se pueden perder los enlaces, y aunque no se perdieran se rompe
con la regla de manipular una estructura de datos inexistente. Una alternativa es utilizar una variable
auxiliar, pero es innecesario aplicando este recorrido.
- Recorrido en amplitud:
Consiste en ir visitando el rbol por niveles. Primero se visitan los nodos de nivel 1 (como mucho hay
uno, la raz), despus los nodos de nivel 2, as hasta que ya no queden ms.
Si se hace el recorrido en amplitud del rbol de la figura una visitara los nodos en este orden:
a,b,c,d,e,f
En este caso el recorrido no se realizar de forma recursiva sino iterativa, utilizando una cola. El
procedimiento consiste en encolar (si no estn vacos) los subrboles izquierdo y derecho del nodo
extrado de la cola, y seguir desencolando y encolando hasta que la cola est vaca.
En la codificacin que viene a continuacin no se implementan las operaciones sobre colas.
if (a != NULL) {
CrearCola(cola);
encolar(cola, a);
while (!colavacia(cola)) {
desencolar(cola, aux);
visitar(aux);
if (aux->izq != NULL) encolar(cola, aux->izq);
if (aux->der != NULL) encolar(cola, aux->der);
22
}
}
}
Por ltimo, considrese la sustitucin de la cola por una pila en el recorrido en amplitud. Qu tipo de
recorrido se obtiene?
Antes de explicarlo se recomienda al lector que lo intente hacer por su cuenta, es sencillo cuando uno
es capaz de construir el rbol viendo sus recorridos pero sin haber visto el rbol terminado.
Partiendo de los recorridos preorden e inorden del rbol de la figura 1 puede determinarse que la raz
es el primer elemento del recorrido en preorden. Ese elemento se busca en el array inorden. Los
elementos en el array inorden entre izq y la raz forman el subrbol izquierdo. Asimismo los
elementos entre der y la raz forman el subrbol derecho. Por tanto se tiene este rbol:
23
El subrbol b tiene un subrbol derecho, que no tiene ningn descendiente, tal y como indican los
ndices izq y der. Se ha obtenido el subrbol izquierdo completo de la raz a, puesto queb no tiene
subrbol izquierdo:
24
- Una estructura vaca o
- Un elemento o clave de informacin (nodo) ms un nmero finito -a lo sumo dos- de estructuras tipo
rbol, disjuntos, llamados subrboles y adems cumplen lo siguiente:
* Todas las claves del subrbol izquierdo al nodo son menores que la clave del nodo.
* Todas las claves del subrbol derecho al nodo son mayores que la clave del nodo.
* Ambos subrboles son rboles binarios de bsqueda.
Figura 5
Al definir el tipo de datos que representa la clave de un nodo dentro de un rbol binario de bsqueda
es necesario que en dicho tipo se pueda establecer una relacin de orden. Por ejemplo, suponer que
el tipo de datos de la clave es un puntero (da igual a lo que apunte). Si se codifica el rbol en Pascal
no se puede establecer una relacin de orden para las claves, puesto que Pascal no admite
determinar si un puntero es mayor o menor que otro.
En el ejemplo de la figura 5 las claves son nmeros enteros. Dada la raz 4, las claves del subrbol
izquierdo son menores que 4, y las claves del subrbol derecho son mayores que 4. Esto se cumple
tambin para todos los subrboles. Si se hace el recorrido de este rbol en orden central se obtiene
una lista de los nmeros ordenada de menor a mayor.
Cuestin: Qu hay que hacer para obtener una lista de los nmeros ordenada de mayor a menor?
Una ventaja fundamental de los rboles de bsqueda es que son en general mucho ms rpidos para
localizar un elemento que una lista enlazada. Por tanto, son ms rpidos para insertar y borrar
elementos. Si el rbol est perfectamente equilibrado -esto es, la diferencia entre el nmero de
nodos del subrbol izquierdo y el nmero de nodos del subrbol derecho es a lo sumo 1, para todos
los nodos- entonces el nmero de comparaciones necesarias para localizar una clave es
25
aproximadamente de logN en el peor caso. Adems, el algoritmo de insercin en un rbol binario de
bsqueda tiene la ventaja -sobre los arrays ordenados, donde se empleara bsqueda dicotmica
para localizar un elemento- de que no necesita hacer una reubicacin de los elementos de la
estructura para que esta siga ordenada despus de la insercin. Dicho algoritmo funciona avanzando
por el rbol escogiendo la rama izquierda o derecha en funcin de la clave que se inserta y la clave
del nodo actual, hasta encontrar su ubicacin; por ejemplo, insertar la clave 7 en el rbol de la figura 5
requiere avanzar por el rbol hasta llegar a la clave 8, e introducir la nueva clave en el subrbol
izquierdo a 8.
El algoritmo de borrado en rboles es algo ms complejo, pero ms eficiente que el de borrado en un
array ordenado.
Ahora bien, suponer que se tiene un rbol vaco, que admite claves de tipo entero. Suponer que se
van a ir introduciendo las claves de forma ascendente. Ejemplo: 1,2,3,4,5,6
Se crea un rbol cuya raz tiene la clave 1. Se inserta la clave 2 en el subrbol derecho de 1. A
continuacin se inserta la clave 3 en el subrbol derecho de 2.
Continuando las inserciones se ve que el rbol degenera en una lista secuencial, reduciendo
drsticamente su eficacia para localizar un elemento. De todas formas es poco probable que se de un
caso de este tipo en la prctica. Si las claves a introducir llegan de forma ms o menos aleatoria
entonces la implementacin de operaciones sobre un rbol binario de bsqueda que vienen a
continuacin es en general suficiente.
Existen variaciones sobre estos rboles, como los AVL o Red-Black (no se tratan aqu), que sin llegar
a cumplir al 100% el criterio de rbol perfectamente equilibrado, evitan problemas como el de obtener
una lista degenerada.
- Bsqueda
Si el rbol no es de bsqueda, es necesario emplear uno de los recorridos anteriores sobre el rbol
para localizarlo. El resultado es idntico al de una bsqueda secuencial. Aprovechando las
propiedades del rbol de bsqueda se puede acelerar la localizacin. Simplemente hay que
descender a lo largo del rbol a izquierda o derecha dependiendo del elemento que se busca.
26
else if (a->clave > elem) return buscar(a->izq, elem);
else return TRUE;
}
- Insercin
- Borrado
La operacin de borrado si resulta ser algo ms complicada. Se recuerda que el rbol debe seguir
siendo de bsqueda tras el borrado. Pueden darse tres casos, una vez encontrado el nodo a borrar:
1) El nodo no tiene descendientes. Simplemente se borra.
2) El nodo tiene al menos un descendiente por una sola rama. Se borra dicho nodo, y su primer
descendiente se asigna como hijo del padre del nodo borrado. Ejemplo: en el rbol de la figura 5 se
borra el nodo cuya clave es -1. El rbol resultante es:
27
3) El nodo tiene al menos un descendiente por cada rama. Al borrar dicho nodo es necesario
mantener la coherencia de los enlaces, adems de seguir manteniendo la estructura como un rbol
binario de bsqueda. La solucin consiste en sustituir la informacin del nodo que se borra por el de
una de las hojas, y borrar a continuacin dicha hoja. Puede ser cualquier hoja? No, debe ser la que
contenga una de estas dos claves:
la mayor de las claves menores al nodo que se borra. Suponer que se quiere borrar el nodo 4 del
rbol de la figura 5. Se sustituir la clave 4 por la clave 2.
la menor de las claves mayores al nodo que se borra. Suponer que se quiere borrar el nodo 4 del
rbol de la figura 5. Se sustituir la clave 4 por la clave 5.
El algoritmo de borrado que se implementa a continuacin realiza la sustitucin por la mayor de las
claves menores, (aunque se puede escoger la otra opcin sin prdida de generalidad). Para lograr
esto es necesario descender primero a la izquierda del nodo que se va a borrar, y despus avanzar
siempre a la derecha hasta encontrar un nodo hoja. A continuacin se muestra grficamente el
proceso de borrar el nodo de clave 4:
Codificacin: el procedimiento sustituir es el que desciende por el rbol cuando se da el caso del nodo
con descencientes por ambas ramas.
28
void borrar(tarbol **a, int elem)
{
void sustituir(tarbol **a, tarbol **aux);
tarbol *aux;
free(aux);
}
}
1. CONCEPTOS BASICOS
29
Las secuencias de aristas forman caminos o ciclos. Un ciclo es un camino que termina
en el mismo nodo donde comenz. Si el camino recorre todos los nodos del grafo es
llamado tour. El nmero de aristas en un camino es la longitud del camino.
Se dice que un grafo es conexo si se puede llegar desde cualquier nodo hasta cualquier
otro mediante un camino. De lo contrario no es conexo, pero puede dividirse en componentes
conexas, que son subconjuntos de nodos y aristas del grafo original que si son conexos. Un grafo
conexo sin ciclos es llamado un rbol.
Estos son apenas unos cuantos conceptos de lo que se conoce como la Teora de Grafos. El
objetivo de estas notas no es cubrir por completo dicha teora sino enfocarnos en la
implementacin de este tipo de estructuras y las operaciones y algoritmos ms comunes e
importantes que se aplican sobre las mismas.
2. REPRESENTACION EN EL COMPUTADOR
Hay por lo menos dos maneras evidentes de representar un grafo en un computador, utilizando
la notacin pseudoformal propuesta en [2]. La primera utiliza lo que se conoce como una
matriz de adyacencia, a saber:
CLASE Grafo
Privado:
Un valor verdadero en la posicin (i,j) de la matriz indica que hay una arista que
conecta al nodo i con el nodo j. Para representar un grafo pesado se puede cambiar la matriz
de adyacencia de lgicos a una matriz de registros, siendo el peso un campo del registro.
30
Si no se cumple la primera de estas condiciones y el nmero de nodos en el grafo puede
variar drsticamente entonces se justifica el uso de estructuras dinmicas. En este caso, lo
ideal es utilizar una lista lineal de nodos conteniendo la informacin en <Tipo>. Por
supuesto, si el nmero de nodos va a cambiar entonces tampoco se justificas tener un
matriz estticas, por lo que debera utilizarse una matriz esparcida.
entero Id;
<Tipo> Info;
Nodo proximo;
#Operaciones aqu
FCLASE
#La declaracin de los nodos para las columnas (NodoC), filas (NodoF) y
#relativa.
CLASE Grafo
Privado:
Publico:
Sin embargo, puede que esta solucin no sea la ms conveniente por el hecho de que la
matriz esparcida ocupar ms memoria que su contraparte esttica a medida que el nmero
de conexiones entre los nodos sea mayor, ya que habr pocos elementos no nulos dentro de
la matriz. En ese caso, se debe utilizar otra implementacin.
31
CLASE Nodo #Nodo de la lista de <Tipo>
Publico:
entero Id;
<Tipo> Info;
Nodo proximo;
Ady ListaDeAdyacentes;
#Operaciones aqu
FCLASE
Publico:
Nodo AdyAeste;
Ady proximo;
#Operaciones aqu
FCLASE
CLASE Grafo
Privado:
Publico:
32
# Todas las operaciones aqu
FCLASE
33
Esta representacin ocupa menos memoria que la anterior sin importar si la matriz
esparcida est muy llena o no, pero puede incrementar la complejidad de algunas
peraciones, como por ejemplo saber cules nodos son adyacentes a un nodo en particular
(en caso de un grafo dirigido).
De nuevo, si las aristas tambin tienen algn tipo de informacin asociada bastara una
leve modificacin en la clase Ady estructura para agregarla.
Por supuesto, se deben implementar las operaciones ms comunes como agregar un nodo
al grafo, eliminar un nodo del grafo y conectar un nodo con otro. En adicin, se puede
implementar todo tipo de operaciones basadas en la teora de grafos, para resolver los
problemas que se describen a continuacin.
Los algoritmos que se tratan en este texto son fundamentales y son muy tiles en muchas
aplicaciones, pero solamente son una introduccin al tema de algoritmos de grafos. Existe
un gran variedad de problemas relacionados con grafos y una gran variedad de
algoritmos para procesamiento de grafos, pero claramente no todo problema de grafos es
sencillo de resolver y en muchas ocasiones tampoco es sencillo determinar que tan difcil
puede ser resolverlo.
Fciles: Un problema fcil de procesamiento de grafos es aquel que se puede resolver
utilizando un programa eficiente y elegante. Frecuentemente su tiempo de ejecucin es
lineal en el peor caso, o limitado por un polinomio de bajo grado en el nmero de nodos o el
nmero de aristas.
Generalmente, tambin podemos decir que el problema es fcil si podemos desarrollar un
algoritmos de fuerza bruta que aunque sea lento para grandes grafos, es til para grafos
pequeos e inclusive de tamao medio. Entonces, una vez que sabemos que el problema es
fcil, buscamos soluciones eficientes y escogemos la mejor de ellas.
Tratable: Un problema tratable de procesamiento de grafos es aquel para el que se conoce
un algoritmo que garantiza que sus requerimientos en tiempo y espacio estn limitados
por una funcin polinomial en el tamao del grafo (nmero de nodos + nmero de aristas).
Todo problema fcil es tratable, pero se hace la distincin debido a que el desarrollo de
una solucin eficiente para resolverlo es extremadamente difcil o imposible. Las soluciones a
algunos problemas intratables nunca han sido escritas en programas, o tiempo tiempos de
ejecucin tan altos que no puede contemplarse su utilizacin en la prctica.
34
Intratable: Un problema intratable de procesamiento de grafos es aquel para el que no se
conoce algoritmo que garantice obtener una s o l u c i n d e l p r o b l e m a e n u n a
c a n t i d a d r a z o n a b l e d e tiempo. Muchos de estos problemas tienen la
caracterstica de que podemos utilizar un mtodo de fuerza bruta para probar todas las
posibilidades de calcular la solucin, y se consideran intratables porque existen demasiadas
posibilidades a considerar.
Esta clase de problemas es extensa y muchos expertos piensan que no existen algoritmos
eficientes para solucionar estos problemas. El trmino NP-hard describe los
problemas de esta clase, el cual representa un altsimo nivel de dificultad.
Desconocida: Existen problemas de procesamiento de grafos cuya dificultad es desconocida.
No hay un algoritmo eficiente conocido para resolverlos, ni son conocidos como NP-hard. El
problema de isomorfismo de grafos pertenece a esta clase.
35
Clausura Transitiva: Consiste en tratar de encontrar un conjunto de vrtices que pueda ser
alcanzado siguiendo aristas dirigidas desde cada vrtice del dgrafo.
Caminos cortos a partir de un mismo origen: Consiste en encontrar cuales son los caminos
ms cortos conectando a un vrtice v cualquier con cada uno de los otros vrtices de un dgrafo
pesado. Este es un problema que por lo general se presenta en redes de computadores,
representadas como grafos.
Planaridad: Consiste en estudiar si un grafo puede ser dibujado sin que ninguna de las lneas
que representan las aristas se intercepten.
36
El camino ms largo: Consiste en encontrar cual es el camino ms largo que conecte a
dos nodos dados en el grafo. Aunque parece sencillo, este problema es una versin del
problema del tour de Hamilton y es NP-hard.
Colorabilidad: Consiste en estudiar si existe alguna manera de asignar k colores a cada uno
de los vrtices de un grafo, de tal forma de que ninguna arista conecte dos vrtices del
mismo color. Este problema clsico es fcil para k=2 pero es NP-hard para k=3.
Conjunto Independiente: Consiste en encontrar el tamao del mayor subconjunto
de nodos de un grafo con la propiedad de que no haya ningn par conectado por una arista. Este
problema es NP-hard.
Clique: Consiste en encontrar el tamao del clique (subgrafo completo) ms grande en un
grafo dado.
Isomorfismo de grafos: Consiste en estudiar la posibilidad de hacer dos grafos idnticos
con solo renombrar sus nodos. Se conocen algoritmos eficientes para solucionar este
problema, para varios clases particulares de grafos, pero no se tiene solucin para el
problema general. Este problema es NP-hard.
4. RECORRIDO DE GRAFOS
Lo que diferencia un algoritmo de recorrido de otro es, una vez ubicado en un nodo en
particular, la forma en que se visitan los nodos conectados a este. Por supuesto, estos algoritmos
pueden ser aplicados en grafos dirigidos o no dirigidos.
37
Recorrido en profundidad
Para efectuar un recorrido en profundidad de un grafo, se selecciona cualquier nodo como
punto de partida (por lo general el primer nodo del grafo) y se marcan todos los nodos
del grafo como no visitados. El nodo inicial se marca como visitado y si hay un nodo
adyacente a este que no haya sido visitado, se toma este nodo como nuevo punto de partida
del recorrido. El recorrido culmina cuando todos los nodos hayan sido visitados.
Se dice que el recorrido es en profundidad, porque para visitar otro nodo adyacente del
nodo inicial, primero se deben visitar TODOS los nodos adyacentes al que se eligi antes.
Es as, como el nmero de ambientes recursivos vara dependiendo de la profundidad que
alcance el algoritmo.
Ady aux;
#visitarlos
fsi
38
aux aux .proximo;
fmientras
FACCION
Publico:
Nodo aux;
aux primerNodo;
#ponentes conexas
DFS_R(aux);
fsi
fmientras
FACCION
Este algoritmo recorre todos los nodos del grafo pero fcilmente puede modificarse para
que sea una funcin que encuentre un nodo en particular dentro de grafo. Este algoritmo
se conoce como el algoritmo DFS (Depth-First Search).
39
Una bondad de este algoritmo es que los nodos solo se vistan una vez. Esto implica que si
se salvan en alguna estructura las aristas que se van recorriendo se obtiene un conjunto
de aristas de cubrimiento mnimo del grafo, lo cual se utiliza frecuentemente se utiliza para
reducir la complejidad del grafo cuando la perdida de informacin de algunas aristas no es
importante. Este resultado se conoce como rbol DFS (DFS Tree).
0 2 0 2
6 6
1 7 1 7
3 3
5 4 5 4
El DFS puede modificarse fcilmente y utilizarse para resolver problemas sencillos como
los de conectividad simple, deteccin de ciclos y camino simple. Por ejemplo, el nmero
de veces que se invoca a la accin DFS_R desde la accin DFS en el algoritmo anterior es
exactamente el nmero de componentes conexas del grafo, lo cual representa la solucin al
problema de conectividad simple.
Recorrido en anchura
En este algoritmo tambin se utiliza la estrategia de marcas los nodos como visitados
para detectar la culminacin del recorrido, pero los nodos se recorren de una manera
ligeramente distinta.
De nuevo, se selecciona cualquier nodo como punto de partida (por lo general el primer
nodo del grafo) y se marcan todos los nodos del grafo como no visitados. El nodo inicial se
marca como visitado y luego se visitan TODOS los nodos adyacentes a este, al finalizar este
40
proceso se busca visitar nodos ms lejanos visitando los nodos adyacentes a los nodos
adyacentes del nodo inicial.
Este algoritmo puede crear menos ambientes recursivos que el anterior porque visita ms
nodos en un mismo ambiente, pero esto depende de cmo este construido el grafo. El algoritmo
se conoce como el algoritmo de BFS (Breadth-First Search).
Este algoritmo tiene exactamente el mismo orden en tiempo de ejecucin del algoritmo de
recorrido en profundidad y tambin se puede obtener el conjunto de aristas de cubrimiento mnimo
del grafo.
Una diferencia notable entre el DFS y el BFS es que este ultimo necesita de una estructura
auxiliar, que por lo general es una cola, para el almacenamiento de las aristas que se van a
visitar durante el recorrido.
0 2 0 2 0 2
1 7 1 7 1 7
6 6 6
3 3 3
5 4 5 4 5 4
C: 0 -5 0-7 2-6 C: 0-7 2-6 5-3 5-4
C: 0 -2 0-5 0-7
0 2 0 2 0 2
6 6 6
1 7 1 7 1 7
3 3 3
5 4 5 4 5 4
C: 2 -6 5-3 5-4 7-1 7-4 C: 5-3 5-4 7-1 7-4 6-4 C: 5-4 7-1 7-4 6 -4 3 -4
41
0 2 0 2
6 6
1 7 1 7
3 3
5 4 5 4
0 2 0 2
6 6
1 7 1 7
3 3
5 4 5 4
42
Tambin puede modificarse fcilmente y utilizarse para resolver problemas sencillos
como los de conectividad simple, deteccin de ciclos y camino simple.
El BFS es el algoritmo clsico para encontrar el camino ms corto entre dos nodos especficos en
un grafo, mientras que DFS nos ofrece muy poca ayuda para esta tarea debido a que el
orden en el que se visitan los nodos no tiene absolutamente ninguna relacin con la longitud
de los caminos.
Todo camino en un dgrafo pesado tiene un peso asociado, el cual es la suma de los pesos de
las aristas del camino. Esta medida esencial nos permite formular problemas como el de
encontrar el camino con el menor peso entre dos vrtices. El tpico de esta seccin es el
clculo de este tipo de camino, donde la longitud del camino no se mide en base al
nmero de aristas del mismo, sino en base al peso del camino.
Con esto ltimo en mente, definiremos al camino ms corto entre dos nodos de un dgrafo
pesado, como el camino dirigido que tenga la propiedad de tener el peso mnimo entre
todos los caminos que existan entre dicho par de nodos.
43
El primero de estos problemas no es ms que un caso particular del segundo. En lo
que respecta al segundo, por ol general lo que se busca es tratar de obtener un rbol de
caminos ms cortos o el SPT (shortest-path tree), que consiste en un rbol dirigido que
tiene como raz al nodo origen y todo camino en el rbol en un camino corto en el grafo. El tercero
de los problemas se puede resolver obteniendo los SPT correspondientes a cada uno de los
nodos del grafo.
Algoritmo de Dijkstra
El algoritmo de Dijkstra resuelve el problema de encontrar los caminos ms cortos a partir de un
origen, en grafos pesados que no tengan pesos negativos.
entero i,w,v;
Arreglo D de real [1..N]; # arreglo auxiliar de costos
Arreglo P de entero [1..N]; # arreglo que guarda los caminos ms
# cortos
44
#el esbozo del algoritmo de Dijkstra
S.Agregar(w);
45
D[v] min (D[v], D[w]+C[w,v]);
Fpara
P[v] w;
Fpara
10 100
30
2
5
50 10
60
3
20
4
46
Al final de la ejecucin el arreglo P debe tener los valores P[2]=1, P[3]=4 , P[4]=1 y P[5]=3.
Para encontrar el camino ms corto del nodo 1 al nodo 5, por ejemplo, se siguen los
predecesores en orden inverso comenzando en 5. As, es sencillo encontrar que el camino
ms corto del nodo 1 al 5, es el 1, 4, 3, 5.
Usando el arreglo P, o bien mediante alguna otra heurstica, se puede construir fcilmente
un SPT, tomando el nodo inicial del recorrido como raz del rbol y luego aadiendo una
arista y un nodo a la vez, siempre tomando la prxima arista que pertenezca al camino ms
corto a un nodo que no est en el SPT.
Aunque se puede ejecutar Dijkstra N veces para resolver el problemas de caminos cortos
entre cada par de nodos, el Algoritmo de Floyd [5] tambin resuelve este problema, con una
complejidad en tiempo similar.
El problema de encontrar el MST de un grafo pesado no dirigido arbitrario tiene una gran
cantidad de aplicaciones importantes y se conocen algoritmos para encontrarlo al menos
47
desde 1920, pero la eficiencia de las implementaciones vara ampliamente y los investigadores
an buscan mejores mtodos. En esta seccin se examinan dos algoritmos clsicos para
resolver este problema.
Algoritmo de Prim
U U
0 5 0 0
1 3 3 1 3
5
1 2 1 1
4
2 2 2
0 U 0
1 3 1 3
1 1 2
48
4 4
2 2
0 5 0 5 0 5 0 5
1 3 1 3 1 3 1 3
5 5 5 5
1 2 1 2 1 2 1 2
4 4 4 4
2 2 2 2
49
Se comienza en el nodo 0 y se apilan las aristas adyacentes a este nodo, en
orden decreciente. La arista mnima es la que esta en el tope de la pila, as que se
desapila y se agrega al MST. Seguidamente se procede con el nodo 1 y se apilan sus
aristas adyacentes, con la diferencia de que hay que verificar si dichas aristas
representan un nuevo camino mnimo con respecto a las aristas que ya estn
introducidas en la pila. En este caso no se apila la arista 1-3 porque ya hay una arista
que lleve a 3 con el mismo costo en la pila. Se toma 1-2 porque esta en el tope y se
procede con el nodo 2. Cuando se va a apilar la arista
2-3, se encuentra que ya hay un camino que lleve a 3 pero de mayor costo, as que
se desapila 0-3 y luego se apila 2-3. Se agrega 2-3 al MST y termina el proceso, porque el
conjunto de nodos en el MST es igual al conjunto de vrtices del grafo original.
Algoritmo de Kruskal
El algoritmo de Prim construye un MST una arista a la vez, encontrando una nueva arista
que agregar a un MST que va creciendo en cada paso. El algoritmo de Kruskal
tambin construye el MST una arista a la vez, con la diferencia que este encuentra una
arista que conecte dos MST que van creciendo dentro de un bosque de MST
crecientes, formado de los nodos del grafo original.
Dada una lista de las aristas del grafo, el primer paso del algoritmo de Kruskal es ordenarlas
por peso (usando un quicksort por ejemplo). Luego se van procesando las aristas en el
orden de su peso, agregando aristas que no produzcan ciclos en el MST. El algoritmo de
Kruskal es de O(A*log2 A), donde A es el nmero de aristas del grafo. El siguiente ejemplo
ilustra el funcionamiento del algoritmo. La secuencia de ilustraciones va de izquierda a
derecha y de arriba hacia abajo.
50
0 0 0 0
3 1 3 1 3 1 3
1 1 1 2 1 2
4
2 2 2 2
ALGORITMOS DE ORDENACIN
Dado un conjunto de n elementos a1, a2,..., an y una relacin de orden total () sobre ellos, el
problema de la ordenacin consiste en encontrar una permutacin de esos elementos ordenada
de forma creciente.
Aunque tanto el tipo y tamao de los elementos como el dispositivo en donde se encuentran
almacenados pueden influir en el mtodo que utilicemos para ordenarlos, en este tema vamos a
solucionar el caso en que los elementos son nmeros enteros y se encuentran almacenados en un
vector.
Si bien existen distintos criterios para clasificar a los algoritmos de ordenacin, una posibilidad es
atendiendo a su eficiencia. De esta forma, en funcin de la complejidad que presentan en el caso
medio, podemos establecer la siguiente clasificacin:
51
a[i] en su sitio correcto, aprovechando el hecho de que el subvector a [1..i1] ya ha sido
previamente ordenado. Este mtodo puede ser implementado de forma iterativa como sigue:
Este mtodo se muestra muy adecuado para aquellas situaciones en donde necesitamos ordenar
un vector del que ya conocemos que est casi ordenado, como suele suceder en aquellas
aplicaciones de insercin de elementos en bancos de datos previamente ordenados cuya
ordenacin total se realiza peridicamente.
El mtodo de ordenacin por insercin es similar al proceso tpico de ordenar tarjetas de nombres
(cartas de una baraja) por orden alfabtico, que consiste en insertar un nombre en su posicin
correcta dentro de una lista o archivo que ya est ordenado. As el proceso en el caso de la lista de
enteros A = 50, 20, 40, 80, 30.
(novella.mhhe, n.d.)
En cada paso (i=1...n1) este mtodo busca el mnimo elemento del subvector a[i..n] y lo
intercambia con el elemento en la posicin i:
52
(Tecnicas de diseo de algoritmos)
(novella.mhhe, n.d.)
ORDENACIN BURBUJA
53
Este mtodo de ordenacin consiste en recorrer los elementos siempre en la misma direccin,
intercambiando elementos adyacentes si fuera necesario:
Este algoritmo funciona de forma parecida al de Seleccin, pero haciendo ms trabajo para llevar
cada elemento a su posicin. De hecho es el peor de los tres vistos hasta ahora, no slo en cuanto
al tiempo de ejecucin, sino tambin respecto al nmero de comparaciones y de intercambios que
realiza.
Una posible mejora que puede admitir este algoritmo es el control de la existencia de una pasada
sin intercambios; en ese momento el vector estar ordenado.
54
(novella.mhhe, n.d.)
55
ORDENACIN POR MECLA (MERGESORT)
Este mtodo utiliza la tcnica de Divide y Vencers para realizar la ordenacin del vector a. Su
estrategia consiste en dividir el vector en dos subvectores, ordenarlos mediante llamadas
recursivas, y finalmente combinar los dos subvectores ya ordenados. Esta idea da lugar a la
siguiente implementacin:
El mtodo de ordenacin por Mezcla se adapta muy bien a distintas circunstancias, por lo que es
comnmente utilizado no slo para la ordenacin de vectores. Por ejemplo, el mtodo puede ser
tambin implementado de forma que el acceso a los datos se realice de forma secuencial, por lo
que hay diversas estructuras (como las listas enlazadas) para las que es especialmente apropiado.
Tambin se utiliza para realizar ordenacin externa, en donde el vector a ordenar reside en
dispositivos externos de acceso secuencial (i.e. ficheros).
(Hernndez, n.d.)
56
ORDENACIN RPIDA DE HOARE (QUICKSORT)
57
(novella.mhhe, n.d.)
El algoritmo quicksort requiere una estrategia de particin y la seleccin idnea del pivote. Las
etapas fundamentales del algoritmo dependen del pivote elegido aunque la estrategia de particin
suele ser similar.
ALGORITMOS DE BSQUEDA
Bsqueda:
Es un proceso para encontrar un elemento objetivo especfico dentro de un grupo de
elementos.
Comprobar que el elemento objetivo no existe dentro del grupo.
El equipo de elementos en el que se est buscando conjunto de bsqueda.
58
Esttica, Dinmica.
Segn donde se estn ubicando los datos Externos: Almacena en la memoria secundaria:
Discos, Hash.
Bsqueda Interna:
Lineal o secuencial, Binaria, Indirecta.
Por transformaciones de clave o funciones Hash.
Inicio Fin
1 . . . . . . . .
Bsqueda Binaria
Se da si el conjunto de elementos de la bsqueda esta ordenado, entonces la tcnica tiene ms
eficiencia que la anterior.
Este tipo de algoritmos elimina partes del conjunto de bsqueda en cada componente,
aprovechando que el conjunto de bsqueda est ordenado.
59
La bsqueda continua de esta misma forma, determinando el elemento central del
conjunto de candidatos objetivos y eliminando la mitad del resto.
Con las funciones Hash los elementos se almacenan en una tabla de Hash, estando su ubicacin
dentro de la tabla determinada por la funcin Hash, donde cada ubicacin de la tabla se
denominara celda o franja.
Suponga que se quiere crear o almacenar una matriz que albergue 26 elementos:
Nombre --> CREAR FUNCION HASH que asigne a cada nombre una posicin dentro de la matriz que
estar asociada con la primera letra del nombre.
60
Ejemplo: La letra A se asignara a la posicin 0, la letra D se asignara a la posicin 3 de esa matriz, y
as sucesivamente.
0 Ana
1 Brian
2 Carlos
3 David
4 Erika
5 Fabricio
6 Gabriela
7 Helena
.
.
.
. Maritza
.
.
.
. Tomas
.
. Walter
31 Yolanda
COLISIONES
Funcin Hash Perfecta
Es una funcin Hash que asigne a cada elemento a una posicin nica de la tabla.
Una funcin Hash que se limita a distribuir adecuadamente los elementos entre las
distintas posiciones de la tabla, tambin proporcionara los resultados.
61
Una posibilidad es usar los mtodos que se utilizan con las matrices y a continuacin
expandir la tabla cuando se llene. No obstante debe considerarse que una caracterstica
inherente a las tablas Hash es que si rendimiento se degrada significativamente a medida
que se llena. Por lo tanto, la mejor estrategia es hacer uso de un factor de carga.
EJEMPLO:
Si el factor de carga fuera 0.50 la tabla se redimensionara cada vez que alcance el 50%
de ocupacin.
FUNCIONES HASH
El objetivo es encontrar una funcin que permita distribuir de forma razonable (buena) los
elementos dentro de la tabla de forma que se eviten las colisiones.
Una funcin Hash razonablemente segura procurando en tiempo de acceso constante (0, 1) al
conjunto de datos.
Para ello existen tcnicas para desarrollar una funcin Hash para un conjunto de datos concretos.
Utilizar nicamente una parte de la clave o del valor de elemento con el fin de calcular la
ubicacin en donde se debe almacenar el elemento.
Extraccin: Implica en utilizar nuevamente una parte del valor o de la clave del elemento
con el fin de calcular la ubicacin en la que se almacenar.
MTODO DE DIVISIN
Este mtodo consiste en tomar el resto de la divisin por m, el nmero de entradas de la tabla, asi
h (k) = ( k mod m).
Usar m = una potencia de 2, no es buena idea, ya que el valor de hash queda dependiendo de slo
los bits menos significativos de k.
Una forma de hacer hash (k) dependiente de todos los bits menos significativos es usar nmero
primos no muy cercanos a una potencia de dos.
Este mtodo opera en dos pasos. Primero, multiplicamos la clave por una constante A en el rango
0 < A < 1 y extraemos la parte fraccionaria de k*A. Segundo, Multiplicamos este valor por el
nmero de entradas de la tabla y tomamos el piso del (o truncamos el) resultado.
COLISIONES
Prueba lineal
62
Prueba cuadrtica
Doble direccionamiento
PRUEBA LINEAL
Consiste en que una vez que se detecta la colisin se recorre el arreglo secuencialmente a partir
de una colisin, buscando al elemento. El proceso de bsqueda concluye cuando el elemento es
hallado, o cuando se encuentra una posicin vaca. El arreglo se trata como una estructura
circular.
PRUEBA CUADRATICA
Similar a la anterior se diferencia porque las direcciones en esta se obtienen con la frmula:
Permite una mejor distribucin de las claves que colisionan aunque tiene como desventaja que
pueden quedar casillas o celdas sin visitar.
25, 43, 56, 35, 54, 13, 80, 104, 55 y que son asignados segn la siguiente funcin hash.
D i Dx 1 80 K h(k)
2 55 25 6
1 7
3 43 4
6 2 10
4 43 56 7
5 54 35 9
6 25 54 5
7 56 13 4
8 13 104 5
9 104 55 6
10 35
Al aplicar la funcin Hash a la 35, se obtiene la direccin D=6 pero de esta posicin no est el valor
buscado, entonces se calcula Dx en la posicin como la suma D + (1*J), obtenindose la direccin
7, en donde la bsqueda termine cuando se encuentre el valor deseado, en este caso en la
posicin 10
DOBLE DIRECCIONAMIENTO
Es un mtodo que consiste en que una vez que se detecta la colisin, se genera otra direccin
aplicando la misma funcin Hash a la direccin previamente obtenida.
63
D J Dx
D(H(O)) 6 1 7
D'(H(O)) 2 10
D''(H(O)) 3 15
0 1
2
La funcin Hash que se aplica no necesariamente tiene que ser la misma que se utiliz
originalmente, si no que una vez detectada la colisin se debe generar otra colisin.
Por lo tanto, se puede deducir que no existe una regla que permita decidir cul es la mejor funcin
utilizada en el clculo de una sucesin de direcciones.
25, 43, 56, 35, 54, 13, 80, 104 h (k) = (k mod 10)+1.
1
2
3
4 41
5 54
6 25
7 56
8 35
9 104
10 13
Arreglos anidados
Este mtodo consiste en que cada elemento del arreglo tenga otro arreglo, en el cual se
almacenan los elementos que colisionan. Este mtodo resulta ser ineficiente ya que al trabajar con
arreglos se depende del espacio que se haya asignado a los mismos, lo cual resulta un nuevo
problema, este problema es saber el tamao de la segunda estructura que controla la segunda
dimensin.
Encadenamiento
Consiste en que cada posicin de la estructura contenga una lista ligada, la cual crecer con cada
elemento que entre en la estructura, sobre todo con los elementos que generen una colisin. Este
es el mtodo ms eficiente debido a que las listas ligadas son dinmicas y evitan tener tantos
lugares libres como el mtodo arreglos anidados. Como desventaja se puede encontrar que
cuando la lista ligada crece demasiado se pierde la facilidad de acceso directo del mtodo hash.
64
Algoritmos para encontrar coincidencia de patrones
Ejemplo:
En el texto = "anlisis de algoritmos", n=22
y el patrn a buscar: patrn = "algo", m= 4
Fortalezas y debilidades
Fortalezas
Amplia aplicabilidad
Simplicidad
65
Lleva a disear algoritmos que permiten resolver razonablemente algunos problemas
importantes (e.g., multiplicacin de matrices, ordenamiento, bsqueda de subcadenas,
etc.)
Pueden ser punto de referencia para desarrollar algoritmos ms efectivos
Debilidades
Raramente llevan a desarrollar algoritmos altamente eficientes
Algunos algoritmos de fuerza bruta son extremadamente lentos.
Suponga que se est comparando el patrn y el texto en una posicin dada, cuando se encuentra
una discrepancia.
Sea X la parte del patrn que calza con el texto, e Y la correspondiente parte del texto, y suponga
que el largo de X es j. El algoritmo de fuerza bruta mueve el patrn una posicin hacia la derecha,
sin embargo, esto puede ser o no lo correcto en el sentido que los primeros j-1 caracteres de X
pueden o no pueden calzar los ltimos j-1 caracteres de Y.
La observacin clave que realiza el algoritmo Knuth-Morris-Pratt(en adelante KMP) es que X es
igual a Y, por lo que la pregunta planteada en el prrafo anterior puede ser respondida mirando
solamente el patrn de bsqueda, lo cual permite pre calcular la respuesta y almacenarla en una
tabla.
Por lo tanto, si deslizar el patrn en una posicin no funciona, se puede intentar deslizarlo en 2, 3,
..., hasta j posiciones.
Se define la funcin de fracaso (failurefunction) del patrn como:
()=max(<|1==+1
66
Intuitivamente, f(j) es el largo del mayor prefijo de X que adems es sufijo de X. note que j = 1 es
un caso especial, puesto que si hay una discrepancia en b1 el patrn se desliza en una posicin.
Si se detecta una discrepancia entre el patrn y el texto cuando se trata de calzar bj+1, se desliza
el patrn de manera que bf(j) se encuentre donde bj se encontraba, y se intenta calzar
nuevamente.
Suponiendo que se tiene f(j) precalculado, la implementacin del algoritmo KMP es la siguiente:
Algoritmo Boyer-Moore
Hasta el momento, los algoritmos de bsqueda en texto siempre comparan el patrn con el texto
de izquierda a derecha. Sin embargo, suponga que la comparacin ahora se realiza de derecha a
izquierda: si hay una discrepancia en el ltimo carcter del patrn y el carcter del texto no
aparece en todo el patrn, entonces ste se puede deslizar m posiciones sin realizar ninguna
comparacin extra. En particular, no fue necesario comparar los primeros m-1 caracteres del
texto, lo cual indica que podra realizarse una bsqueda en el texto con menos de n
comparaciones; sin embargo, si el carcter discrepante del texto se encuentra dentro del patrn,
ste podra desplazarse en un nmero menor de espacios.
67
El mtodo descrito es la base del algoritmo Boyer-Moore, del cual se estudiarn dos variantes:
Horspool y Sunday.
Boyer-Moore-Horspool (BMH)
El algoritmo BMH compara el patrn con el texto de derecha a izquierda, y se detiene cuando se
encuentra una discrepancia con el texto. Cuando esto sucede, se desliza el patrn de manera que
la letra del texto que estaba alineada con bm, denominada c, ahora se alinee con algn bj, con j<m,
si dicho calce es posible, o con b0, un carcter ficticio a la izquierda de b1, en caso contrario (este
es el mejor caso del algoritmo).
Para determinar el desplazamiento del patrn se define la funcin siguiente como:
0 si c no pertenece a los primeros m-1 caracteres del patrn (Por qu no se considera el
carcter bm?).
jsi c pertenece al patrn, donde j<m corresponde al mayor ndice tal que bj==c.
Esta funcin slo depende del patrn y se puede precalcular antes de realizar la bsqueda
Se puede demostrar que el tiempo promedio que toma el algoritmo BMH es:
68
dondec es el tamao del alfabeto (c<<n). Para un alfabeto razonablemente grande, el algoritmo
es: ().
En el peor caso, BMH tiene el mismo tiempo de ejecucin que el algoritmo de fuerza bruta
Boyer-Moore-Sunday (BMS)
El algoritmo BMH desliza el patrn basado en el smbolo del texto que corresponde a la posicin
del ltimo carcter del patrn. Este siempre se desliza al menos una posicin si se encuentra una
discrepancia con el texto.
Es fcil ver que si se utiliza el carcter una posicin ms adelante en el texto como entrada de la
funcin siguiente el algoritmo tambin funciona, pero en este caso es necesario considerar el
patrn completo al momento de calcular los valores de la funcin siguiente. Esta variante del
algoritmo es conocida como Boyer-Moore-Sunday (BMS).
Es posible generalizar el argumento, es decir, se pueden utilizar caracteres ms adelante en el
texto como entrada de la funcin siguiente? La respuesta es no, dado que en ese caso puede
ocurrir que se salte un calce en el texto.
CONCLUSIONES:
El mtodo de bsqueda secuencial compara cada elemento del arreglo con el valor a
encontrar hasta que se consiga o hasta leer todo el arreglo.
La bsqueda secuencial examina el vector desde el primer elemento hasta llegar al ltimo.
El ordenamiento por burbuja consiste en llevar los elementos menores a la izquierda o a
los mayores a la derecha del conjunto de elementos en el arreglo.
El mtodo de la burbuja es la tcnica ms usada por su comprensin fcil, aunque en la
programacin este consume mucho tiempo de computadora.
El mtodo de bsqueda binaria se encarga de examinar primero el elemento central de la
lista, si este es el elemento buscado entonces la bsqueda termino.
La bsqueda binaria se utiliza en vectores ya ordenados.
El rendimiento del mtodo de ordenamiento quicksort depende de la buena eleccin de
un pivote, esto permite que este sea ms ptimo que el mtodo de ordenamiento
mergesort.
Las colisiones se producen cuando, despus de implementar una funcin hash en dos entradas
distintas, se produce una misma salida, por lo tanto se obtienen dos datos en una misma
salida.
La eleccin de un mtodo adecuado para resolver estas colisiones es tan importante como
elegir correctamente la funcin hash.
Hay tres mtodos importantes que son, Resignacin, Arreglos anidados, Encadenamiento
El mtodo de arreglos anidados, es un mtodo que presenta dificultades y no es muy
aconsejable utilizar por su gran costo en cuanto a memoria, ya que se desperdician
demasiados espacios.
69
Bibliografa
[1] Aho, Alfred V.; Hopcroft, Jhon E. ; Ullman, Jeffrey D. Data Estructures and
Algorithms. Addison-Wesley. Massachusetts, EUA. 1983.
[2] Coto, Ernesto. Lenguaje Pseudoformal para la Construccin de Algoritmos. ND 2002-
08. Laboratorio de Computacin Grfica. Universidad Central de Venezuela. Caracas,
Venezuela. Octubre, 2002.
[3] Chvtal, V. Linear Programming. W.H. Freeman and Co., New York, NY, 1983.
[4] Ford Jr., L. R. ; Fulkerson, D. R. Flows in Networks. Princeton University Press,
Princeton, NJ, 1962.
[5] Sedgewick, Robert. Algorithms in C++, Third Edition, Part 5: Graph Algorithms.
Addison-Wesley. 2002.
Hernndez, E. G. (s.f.). punto com no es un lenguaje. Obtenido de Tutorial Java. Aprende a
programar con Java desde cero.:
http://puntocomnoesunlenguaje.blogspot.com/2014/10/java-mergesort.html
70