Está en la página 1de 7

UNIVERSIDAD DE LAS FUERZAS ARMADAS-ESPE SEDE SANTO

DOMINGO
DEPARTAMENTO DE CIENCIAS DE LA COMPUTACIÓN - DCCO-SS

CARRERA DE INGENIERÍA EN TECNOLOGÍAS DE LA INFORMACIÓN

PERIODO : octubre 2021 – febrero 2022

ASIGNATURA : Estructura de Datos

TEMA : Investigación acerca del Diseño de algoritmos.

NOMBRES : Luis Vásquez

NIVEL-PARALELO : Tercero “A”

DOCENTE : Ing. Luis Ortiz

FECHA DE ENTREGA : 2 de febrero de 2022

SANTO DOMINGO - ECUADOR

2022
Índice

1 Introducción ............................................................................................................................................ 2
2 Sistemas de Objetivos .......................................................................................................................... 2
2.1 Objetivo General: .......................................................................................................................... 2
2.2 Objetivos Específicos: ................................................................................................................. 2
3 Desarrollo ................................................................................................................................................. 3
3.1 Divide y Vencerás: ........................................................................................................................ 3
3.2 Programación Dinámica............................................................................................................. 4
3.3 Back Tracking................................................................................................................................. 5
4 Conclusiones ........................................................................................................................................... 6
5 Recomendación ...................................................................................................................................... 7
6 Bibliografía/ Referencias/ páginas web....................................................................................... 7

1 Introducción
El presente trabajo de investigación busca abordar el marco teórico de los temas: Divide
y Vencerás, Programación Dinámica y Back Tracking desde una perspectiva académica
en donde el objetivo principal del documento es lograr que se expongan las principales
características y aplicaciones de los temas a abordar desde el punto de vista de la
programación e informática, toda la información será obtenida de fuentes con veracidad
académica.

2 Sistemas de Objetivos

2.1 Objetivo General:

1. Realizar una investigación acerca de lo siguiente temas: Divide y Vencerás,


Programación Dinámica y Back Tracking

2.2 Objetivos Específicos:

1. Realizar una investigación de la metodología Divide y Vencerás


2. Realizar una investigación de la metodología de Programación Dinámica
3. Realizar una investigación acerca del Back Tracking
4. Obtener la información a través de fuentes con peso académico la cual
asegure la confiabilidad de la misma.
3 Desarrollo

3.1 Divide y Vencerás:


Divide y vencerás (proveniente del griego: διαίρει καὶ βασίλευε) es ganar y
mantener el poder mediante la ruptura de las concentraciones más grandes, en
fracciones que tienen menos energía en su aislada individualidad. El concepto se
refiere a una estrategia que rompe las estructuras de poder existentes y evita la
vinculación de los grupos de poder más pequeños. Podría ser utilizada en todos
los ámbitos en los que, para obtener un mejor resultado, es en primer lugar
necesario o ventajoso romper o dividir lo que se opone a la solución o a un
determinado problema inicial. («Divide y vencerás», 2021)
En las ciencias de la informática, esta metodología hace referencia a uno de los más
importantes paradigmas de diseño algorítmico. El método está basado en la resolución
recursiva de un problema dividiéndolo en dos o más subproblemas de igual tipo o
similar. El proceso continúa hasta que éstos llegan a ser lo suficientemente sencillos
como para que se resuelvan directamente. Al final, las soluciones a cada uno de los
subproblemas se combinan para dar una solución al problema original.
Diseño e implementación de 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 ≤ 𝑘 ≤ 𝑛), cada uno con una entrada de tamaño 𝑘
𝑛
y donde 0 ≤ 𝑘 < 𝑛. 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 problema nos garantiza la convergencia
hacia los casos elementales, también denominados casos base.
3. Por último, combinar las soluciones obtenidas en el paso anterior para
construir la solución del problema original.

Nota: Los algoritmos del tipo divide y vencerás se diseñan como procedimientos
generalmente recursivos.

Implementación general:

AlgoritmoDyV (p: TipoProblema): TipoSolucion


if esCasoBase(p)
return resuelve(p)

else
subproblemas: array of TipoProblema
subproblemas = divideEnSubproblemas(p)
soluciones_parciales: array of TipoSolucion

for each sp in subproblemas


soluciones_parciales.push_back(AlgoritmoDYV(sp))
endFor

return mezcla(soluciones_parciales)

endIf

finAlgoritmoDyV

3.2 Programación Dinámica


En informática, la programación dinámica es un método para reducir el tiempo
de ejecución de un algoritmo mediante la utilización de subproblemas
superpuestos y subestructuras óptimas, como se describe a continuación.
(Programación dinámica - EcuRed, s. f.)
Una subestructura óptima significa que se pueden usar soluciones óptimas de
subproblemas para encontrar la solución óptima del problema en su conjunto. Por
ejemplo, el camino más corto entre dos vértices de un Grafo se puede encontrar
calculando primero el camino más corto al objetivo desde todos los vértices adyacentes
al de partida, y después usando estas soluciones para elegir el mejor camino de todos
ellos. En general, se pueden resolver problemas con subestructuras óptimas siguiendo
estos tres pasos:

1. Dividir el problema en subproblemas más pequeños.


2. Resolver estos problemas de manera óptima usando este proceso de tres pasos
recursivamente.
3. Usar estas soluciones óptimas para construir una solución óptima al problema
original.
4. Los subproblemas se resuelven a su vez dividiéndolos en subproblemas más
pequeños hasta que se alcance el caso fácil, donde la solución al problema es
trivial.

Decir que un problema tiene subproblemas superpuestos es decir que se usa un mismo
subproblema para resolver diferentes problemas mayores. Por ejemplo, en la Sucesión
de Fibonacci (𝐹3 = 𝐹1 + 𝐹2 𝑦 𝐹4 = 𝐹2 + 𝐹3 ) calcular cada término supone calcular 𝐹2 .
Como para calcular 𝐹5 hacen falta tanto 𝐹3 como 𝐹4 , una mala implementación para
calcular 𝐹5 acabará calculando 𝐹2 dos o más veces. Esto sucede siempre que haya
subproblemas superpuestos: una mala implementación puede acabar desperdiciando
tiempo recalculando las soluciones óptimas a subproblemas que ya han sido resueltos
anteriormente.
Ejemplo:
El algoritmo recursivo que calcula los coeficientes binomiales resulta ser de
complejidad exponencial por la repetición de los cálculos que realiza. No obstante, es
posible diseñar un algoritmo con un tiempo de ejecución de orden 𝑂(𝑛𝑘) basado en la
idea del Triángulo de Pascal, idea claramente aplicable mediante programación
dinámica. Para ello es necesaria la creación de una tabla bidimensional en la que ir
almacenando los valores intermedios que se utilizan posteriormente.
La idea recursiva de los coeficientes binomiales es la siguiente:
= + 𝑠𝑖 0 < 𝑘 < 𝑛
= = 1
La idea para construir la tabla de manera eficiente y sin valores inútiles es la siguiente:

0 1 2 3 ... k-1 k

0 1

1 1 1

2 1 2 1

3 1 3 3 1

... ... ... ... ... ...

... ... ... ... ... ... ...

n-1 C(n-1,k-1) C(n-1,k)

n C(n,k)

3.3 Back Tracking


Estrategia para encontrar soluciones a problemas que satisfacen restricciones. El
término "backtrack" fue acuñado por primera vez por el matemático
estadounidense D. H. Lehmer en los años 1950. (Vuelta atrás (backtracking) -
EcuRed, s. f.)
En su forma básica, la idea de backtracking se asemeja a un recorrido en profundidad
dentro de un grafo dirigido. El grafo en cuestión suele ser un árbol, o por lo menos no
contiene ciclos. Sea cual sea su estructura, existe sólo implícitamente. El objetivo del
recorrido es encontrar soluciones para algún
problema. Esto se consigue construyendo
soluciones parciales a medida que progresa el
recorrido; estas soluciones parciales limitan las
regiones en las que se puede encontrar una
solución completa. El recorrido tiene éxito si,
procediendo de esta forma, se puede definir por
completo una solución. En este caso el
algoritmo puede bien detenerse o bien seguir
buscando soluciones alternativas. 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.
Algoritmia del Back Tracking

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

4 Conclusiones

• Los algoritmos de divide y vencerás también pueden ser implementados por un


programa no recursivo que almacena los subproblemas parciales en alguna
estructura de datos explícita, tales como una pila, una cola, o una cola de
prioridad. Este enfoque permite más libertad a la hora de elegir los
subproblemas a resolver después, una característica que es importante en
algunas aplicaciones, por ejemplo, en la búsqueda en anchura y en el método de
ramificación y poda para optimización de subproblemas.
• Una de las implementaciones del Back Tracking, es ser usado para los análisis
sintácticos de los compiladores. Su uso en Inteligencia artificial ha sido muy
importante, dando lugar a nuevos tipos de búsquedas como el A estrella.

5 Recomendación

• Antes de sumergirnos a programar o diseñar un algoritmo lo primero que


debemos hacer es el planteamiento de dos preguntas: ¿Qué debemos hacer? y
¿Cómo debemos hacerlo? Añadiendo el diseño o boceto de un diagrama de flujo
que nos dé una idea principal de como resolveremos el problema principal, así
reducimos la pérdida de tiempo a la hora de programar.
• Registrarse en https://es.stackoverflow.com/ ya que aquí encontraras muchos
programadores expertos que te pueden echar una mano en caso de no saber
cómo escribir tu código o como solucionar algún problema.
(3 DV.pdf, s. f.; «Alg oritm o div ide y vencerás», 2021; « Div ide y ve ncerá s», 2021; d oc.pdf, s. f.; Pro gramaci ón di námi ca - EcuRed, s. f.; Vuelta atrás ( backt racki ng) - EcuRed, s. f.)

6 Bibliografía/ Referencias/ páginas web


DV.pdf. (s. f.). Recuperado 2 de febrero de 2022, de
https://elvex.ugr.es/decsai/algorithms/slides/3%20DV.pdf
Algoritmo divide y vencerás. (2021). En Wikipedia, la enciclopedia libre.
https://es.wikipedia.org/w/index.php?title=Algoritmo_divide_y_vencer%C3%A
1s&oldid=134790386
Divide y vencerás. (2021). En Wikipedia, la enciclopedia libre.
https://es.wikipedia.org/w/index.php?title=Divide_y_vencer%C3%A1s&oldid=1
40004760
Doc.pdf. (s. f.). Recuperado 3 de febrero de 2022, de
https://www.virtuniversidad.com/greenstone/collect/informatica/archives/HA
SH0106.dir/doc.pdf
Programación dinámica—EcuRed. (s. f.). Recuperado 3 de febrero de 2022, de
https://www.ecured.cu/Programaci%C3%B3n_din%C3%A1mica
Vuelta atrás (backtracking)—EcuRed. (s. f.). Recuperado 3 de febrero de 2022, de
https://www.ecured.cu/Vuelta_atr%C3%A1s_(backtracking)

También podría gustarte