Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
C ar acter í s ti cas
Ló g i ca
D es cr i pci ó n
E j em plo
Se alinea la primera posición del patrón con la primera posición del texto, y se comparan los
caracteres uno a uno hasta que se acabe el patrón, esto es, se encontró una ocurrencia del
patrón en el texto, o hasta que se encuentre una discrepancia.
Si se detiene la búsqueda por una discrepancia, se desliza el patrón en una posición hacia la
derecha y se intenta calzar el patrón nuevamente.
Algoritmos Voraces
Algoritmos que implementan una búsqueda miope
Toman decisiones de acuerdo a la información que tienen en el momento
Ventajas:
Fáciles de implementar
Eficientes cuando funcionan de acuerdo al problema
UNIVERSIDAD TÉCNICA DE MANABÍ
FACULTAD DE CIENCIAS INFORMÁTICAS
DEPARTAMENTO DE INFORMÁTICA Y
ELECTRÓNICA
Desventajas:
DIVIDE Y VENCERÁS
El término Divide y Vencerás en su acepción más amplia es algo más que una técnica de
diseño de algoritmos. De hecho, suele ser considerada una filosofía general para
resolver problemas y de aquí que su nombre no sólo forme parte del vocabulario
informático, sino que también se utiliza en muchos otros ámbitos. En nuestro contexto,
Divide y Vencerás es una técnica de diseño de algoritmos que consiste en resolver un
problema a partir de la solución de subproblemas del mismo tipo, pero de menor
tamaño. Si los subproblemas son todavía relativamente grandes se aplicará de nuevo
esta técnica hasta alcanzar subproblemas lo suficientemente pequeños para ser
solucionados directamente. Ello naturalmente sugiere el uso de la recursión en las
implementaciones de estos algoritmos.
La resolución de un problema mediante esta técnica consta fundamentalmente de los
siguientes pasos:
1. En primer lugar ha de plantearse el problema de forma que pueda ser descompuesto
en k subproblemas del mismo tipo, pero de menor tamaño. Es decir, si el tamaño de la
entrada es n, hemos de conseguir dividir el problema en k subproblemas (donde 1 ≤ k
≤ n), cada uno con una entrada de tamaño nk y donde 0 ≤ nk < n. A esta tarea se le conoce
como división.
2. En segundo lugar han de resolverse independientemente todos los subproblemas,
bien directamente si son elementales o bien de forma recursiva. El hecho de que el
tamaño de los subproblemas sea estrictamente menor que el tamaño original del
UNIVERSIDAD TÉCNICA DE MANABÍ
FACULTAD DE CIENCIAS INFORMÁTICAS
DEPARTAMENTO DE INFORMÁTICA Y
ELECTRÓNICA
de esta forma, se puede definir por completo una solución. En este caso el algoritmo
puede bien detenerse (si lo único que se necesita es una solución del problema) o bien
seguir buscando soluciones alternativas (si deseamos examinarlas todas). Por otra
parte, el recorrido no tiene éxito si en alguna etapa la solución parcial construida hasta
el momento no se puede completar. En tal caso, el recorrido vuelve atrás exactamente
igual que en un recorrido en profundidad, eliminando sobre la marcha los elementos
que se hubieran añadido en cada fase. Cuando vuelve a un nodo que tiene uno o más
vecinos sin explorar, prosigue el recorrido de una solución.
Algoritmo de Backtracking
proc Backtracking (↕X[1 . . . i ]: TSolución,
↑ok: B)
variables L: ListaComponentes
inicio
si EsSolución (X) entonces ok CIERTO
en otro caso
ok FALSO
L=Candidatos (X)
mientras ¬ok ^ ¬Vacía (L) hacer
X[i + 1] Cabeza (L); L Resto (L)
Backtracking (X, ok)
finmientras
finsi
fin
Cada vértice del grafo es un posible estado de la solución del problema. Cada arco del
grafo representa la transición entre dos estados de la solución (i.e., la toma de una
decisión).
Típicamente el tamaño de este grafo será inmenso, por lo que no existirá de manera
explícita. En cada momento sólo tenemos en una estructura los nodos que van desde el
estado inicial al estado actual. Si cada secuencia de decisiones distinta da lugar a un
estado diferente, el grafo es un árbol (el árbol de estados).
Algunas heurísticas son comúnmente usadas para acelerar el proceso. Como las
variables se pueden procesar en cualquier orden, generalmente es más eficiente
intentar ser lo más restrictivo posible con las primeras (esto es, las primeras con
menores valores posibles). Este proceso poda el árbol de búsqueda antes de que se
tome la decisión y se llame a la subrutina recursiva.
Algunas implementaciones muy sofisticadas usan una función de cotas, que examina si
es posible encontrar una solución a partir de una solución parcial. Además, se
comprueba si la solución parcial que falla puede incrementar significativamente la
eficiencia del algoritmo. Por el uso de estas funciones de cota, se debe ser muy
minucioso en su implementación de forma que sean poco costosas
computacionalmente hablando, ya que lo más normal es que se ejecuten en para cada
nodo o paso del algoritmo. Cabe destacar, que las cotas eficaces se crean de forma
parecida a las funciones Heurísticas, esto es, relajando las restricciones para conseguir
mayor eficiencia.
Con el objetivo de mantener la solución actual con coste mínimo, los algoritmos vuelta
atrás mantienen el coste de la mejor solución en una variable que va variando con cada
nueva mejor solución encontrada. Así, si una solución es peor que la que se acaba de
encontrar, el algoritmo no actualizará la solución. De esta forma, devolverá siempre la
mejor solución que haya encontrado.
UNIVERSIDAD TÉCNICA DE MANABÍ
FACULTAD DE CIENCIAS INFORMÁTICAS
DEPARTAMENTO DE INFORMÁTICA Y
ELECTRÓNICA
Programación Dinámica
La programación dinámica es una técnica matemática que se utiliza para la
solución de problemas matemáticos seleccionados, en los cuales se toma una
serie de decisiones en forma secuencial.
Proporciona un procedimiento sistemático para encontrar la combinación de
decisiones que maximice la efectividad total, al descomponer el problema en
etapas, las que pueden ser completadas por una o más formas (estados), y
enlazando cada etapa a través de cálculos recursivos.
Etapa: es la parte del problema que posee un conjunto de alternativas mutuamente
excluyentes, de las cuales se seleccionará la mejor alternativa.
Estado: es el que refleja la condición o estado de las restricciones que enlazan las etapas.
Representa la “liga” entre etapas de tal manera que cuando cada etapa se optimiza por
separado la decisión resultante es automáticamente factible para el problema
completo.
Un grado de creatividad
Un buen conocimiento de la estructura general de los problemas de
programación dinámica para reconocer cuando un problema se puede resolver
por medio de estos procedimientos y como esto se puede llevar a cabo.
CARACTERÍSTICAS DE LOS PROBLEMAS DE PROGRAMACIÓN DINÁMICA
UNIVERSIDAD TÉCNICA DE MANABÍ
FACULTAD DE CIENCIAS INFORMÁTICAS
DEPARTAMENTO DE INFORMÁTICA Y
ELECTRÓNICA
Algoritmos de ordenamiento.
Búsqueda Secuencial
Este algoritmo compara uno a uno los elementos del arreglo hasta recorrerlo por
completo indicando si el número buscado existe. En éste caso no se ordenará la lista de
elementos a diferencia de otros algoritmos.
Su implementación es la siguiente:
Programa: Búsqueda secuencial
Variables
T=10:entero
a[T],temp,i,j,n:entero
x:binario
Inicio
a[i]=númeroaleatorio
fin desde
leer n
x=falso
si a[i] = n entonces
escribir "Posición:”, i
x=verdadero
fin si
fin desde
si x=falso entonces
fin si
UNIVERSIDAD TÉCNICA DE MANABÍ
FACULTAD DE CIENCIAS INFORMÁTICAS
DEPARTAMENTO DE INFORMÁTICA Y
ELECTRÓNICA
escribir a[i]
fin desde
Fin
Búsqueda Binaria
Este algoritmo permite buscar de una manera más eficiente un dato dentro de un
arreglo, para hacer esto se determina el elemento central del arreglo y se compara con
el valor que se esta buscando, si coincide termina la búsqueda y en caso de no ser así se
determina si el dato es mayor o menor que el elemento central, de esta forma se elimina
una mitad del arreglo junto con el elemento central para repetir el proceso hasta
encontrarlo o tener solo un elemento en el arreglo. Para poder aplicar este algoritmo se
requiere que el arreglo este ordenado. Su implementación es la siguiente:
Variables
T=10:entero
a[T],temp,i,j,n,b,busca,al,c: entero
x: binario
Inicio
a[i]=númeroaleatorio
fin desde
leer n
temp = a[i]
UNIVERSIDAD TÉCNICA DE MANABÍ
FACULTAD DE CIENCIAS INFORMÁTICAS
DEPARTAMENTO DE INFORMÁTICA Y
ELECTRÓNICA
a[i] = a[i+1]
a[i+1] = temp
fin si
fin desde
fin desde
//buscando...
ba = 0
al = t-1
c = (ba+al)/2;
b = c+1
si no
al = c-1
fin si
c=(b+al)/2;
fin mientras
si busca = a[c]
else
fin si
escribir a[i]
UNIVERSIDAD TÉCNICA DE MANABÍ
FACULTAD DE CIENCIAS INFORMÁTICAS
DEPARTAMENTO DE INFORMÁTICA Y
ELECTRÓNICA
Fin
Y en general:
- Buscar el mínimo elemento entre una posición i y el final de la lista
- Intercambiar el mínimo con el elemento de la posición i
Algoritmo de búsqueda.
ARBOLES BINARIOS DE BUSQUEDA
Obsérvese la interesante propiedad de que si se listan los nodos del ABB en inorden nos
da la lista de nodos ordenada. Esta propiedad define un método de ordenación similar
al Quicksort, con el nodo raíz jugando un papel similar al del elemento de partición del
Quicksort aunque con los ABB hay un gasto extra de memoria mayor debido a los
punteros. La propiedad de ABB hace que sea muy simple diseñar un procedimiento para
realizar la búsqueda. Para determinar si k está presente en el árbol la comparamos con
la clave situada en la raíz, r. Si coinciden la búsqueda finaliza con éxito, si k<r es
evidente que k, de estar presente, ha de ser un descendiente del hijo izquierdo de la raíz,
y si es mayor será un descendiente del hijo derecho. La función puede ser codificada
fácilmente de la siguiente forma:
if(!t)
return FALSE
else if(t->etiqueta==x)
return TRUE;
else if(t->etiqueta>x)
return pertenece(x,t->hizqda);
else return pertenece(x,t->hdrcha);
}
UNIVERSIDAD TÉCNICA DE MANABÍ
FACULTAD DE CIENCIAS INFORMÁTICAS
DEPARTAMENTO DE INFORMÁTICA Y
ELECTRÓNICA
Referencias
Busqueda Secuencial de Texto. (s.f.). Obtenido de
https://sites.google.com/site/busquedasecuencialdetexto/algoritmo-fuerza-bruta