# data[].attributes.body
Pilas LIFO (Last In, First Out):

Los elementos se añaden y se eliminan desde el mismo extremo.

# data[].attributes.body
Colas FIFO (First In, First Out):

Los elementos se añaden al final y se eliminan desde el frente.

# data[].attributes.body
Colas y Pilas

# data[].attributes.body
utilizamos esta forma de pensar a diario, son necesarios para comprender la data science, el Machine Learning y la Inteligencia Artificial, son el combustible de la nueva revolución industrial

# data[].attributes.body
Grafos Dirigidos y No Dirigidos:

Dirigidos: Las aristas tienen una dirección.

No Dirigidos: Las aristas no tienen dirección.

# data[].attributes.body
Árboles AVL:

Árbol binario balanceado donde la diferencia de altura entre subárboles izquierdo y derecho es como máximo 1.

# data[].attributes.body
Árboles Binarios:

Cada nodo tiene hasta dos hijos, un hijo izquierdo y un hijo derecho.

# data[].attributes.body
Arboles

# data[].attributes.body
Es la capacidad de definir pasos claros para resolver un problema.

# data[].attributes.body
Importancia de entenderlos

# data[].attributes.body
Listas

Estructura de datos que consiste en nodos, cada uno con un valor y una referencia al siguiente nodo.

# data[].attributes.body
Estructuras de Datos Asociadas

# data[].attributes.body
Algoritmo de programación dinámica: Permite descomponer un problema complejo en un conjunto de subproblemas más sencillos. Todos estos subproblemas se resuelven una vez, y su solución se almacena para su uso futuro. Esto evita tener que volver a calcular sus soluciones.

# data[].attributes.body
Características

# data[].attributes.body
Algoritmo de vuelta atrás: Divide el problema en subproblemas que se pueden intentar resolver uno tras otro. Si no se encuentra la solución, basta con retroceder en el problema hasta encontrar la manera de seguir avanzando.

# data[].attributes.body
Conjunto de pasos ordenados para resolver un problema específico o realizar una tarea.

# data[].attributes.body
Algoritmo voraz: Encuentra la solución óptima localmente, con el objetivo de encontrar una solución óptima para el problema global. Un algoritmo recursivo resuelve la versión más simple de un problema y luego resuelve versiones cada vez más grandes hasta encontrar la solución del problema original.

# data[].attributes.body
4. Abstractos: Deben ser representados por una guía o modelo para ordenar procesos y lograr su secuencialidad.

# data[].attributes.body
1.      Finitos: el número de pasos para ejecutar la tarea debe ser finito para darla por concluida o finalizada.

# data[].attributes.body
5. Concisos: Ha de tener en cuenta todas las posibilidades, alternativas y presentaciones del problema para ejecutar la solución exacta y precisa de la tarea.

# data[].attributes.body
3.      Secuencial: A de seguir una serie de pasos ordenados y/o enumerados, entendibles y previamente establecidos.

# data[].attributes.body
6. Exactitud: Debe indicarse un orden claro, específico y lógico de instrucciones para su ejecución en cada paso, sin que exista espacio para la ambigüedad o la duda al programa.

# data[].attributes.body
2. Inicio y fin: Constan de un estado inicial el cual al ser ejecutado sigue una serie de instrucciones para llegar a un estado final concluyendo la tarea

# data[].attributes.body
Algoritmos de fuerza bruta: Consisten en probar todas las soluciones posibles hasta encontrar la mejor. Un algoritmo aleatorio utiliza un número aleatorio al menos una vez durante el cálculo para encontrar la solución del problema.

# data[].attributes.body
MIND MAP