Bienvenido al Curso
Introducción al curso básico de algoritmos y estructuras de datos
Introducción a los algoritmos
¿Qué entiende una computadora?
Lenguajes de programación
Estructuras de datos
¿Qué es un algoritmo?
Metodología para la construcción de un algoritmo
Variables y tipos de datos
User defined data types
Instalando Ubuntu Bash en Windows
Creando nuestro user defined data type
Abstract Data Types básicos: Lists, Stacks, Queues
Explicación gráfica Data Types básicos
Glosario de funciones para Abstract Data Types
Clases y objetos
Creando tu primera Queue: Arrays
Creando tu primera Queue: implementación.
Creando tu primera Queue: implementar la función enQueue
Creando tu primera Queue: implementar la función deQueue
Creando tu primera Queue: main code
Algoritmos de ordenamiento
Algoritmos de ordenamiento
Bubble sort
Bubble sort: implementación
Bubble sort: main code
Insertion sort
Desafío: implementa un algoritmo de ordenamiento
Recursividad
Recursividad
La función Factorial, calculando el factorial recursivamente
Manejo de cadenas de caracteres
Arte: Generando arte recursivo
Divide and conquer y programación dinámica
Divide and Conquer (divide y vencerás)
Qué es la programación dinámica (divide y vencerás v2.0)
MergeSort
Desafío: Buscar el algortimo más rápido de sort
Implementando QuickSort con Python
Implementando QuickSort con Python: main code
Algoritmos 'Greedy'
Qué son los Greedy Algorithm
Ejercicio de programación greedy
Ejercio de programación greedy: main code
Grafos y árboles
Grafos y sus aplicaciones
Árboles
¿Cómo comparar Algoritmos?
Cómo comparar algoritmos y ritmo de crecimiento
¿Qué sigue?
Cierre del curso y siguientes pasos
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Ricardo Celis
Como vimos en la clase anterior existen diversos Abstract Data Types típicos y los más básicos son los siguientes:
List, Conjunto de valores ordenados secuencialmente donde son recuperados mediante un número del 0 al n.
Dictionary: Similar a las listas, pero con un índice numérico o no numérico del tipo de datos que se desee (aunque tiene que ser único)
Linked List: Cada elemento se vincula (Apunta) con el siguiente nodo, al no estar definidas de un inicio. las linked lists pueden tener el tamaño que sea.
Stack (LIFO, Last in First Out): En estos datos se van agregando elementos con la peculiaridad de que el último en agregarse será el primero en recuperarse.
Queue (FIFO, First in First Out): Al contrario del stack, los Queue se caracterizan por que la recuperación de datos siga la misma secuencia de la inserción de los datos, así el primer dato será recuperado al principio, y el último al final.
Aportes 66
Preguntas 6
Queue o cola: Primero que entra, primero que sale. Como una cola en el banco, el que llega primero, primero se atiende.
Stack o pila: Como una pila de juegos o libros, los nuevos llegan y se colocan encima del último libro, so, el primero que sacas es el último que agregaste a la pila.
Usar los tipos de datos equivocados puede ser catastrófico. Imagínate una fila de banco que atiende de primeras al último que llega, ¡sería terrible! 😱
En esta imagen se muestran los diferentes tipos de datos:
(from Dartford Grammar School Computer Science Department.)
Algo curioso sobre las Linked List es que al ser nodos independientes a diferencia de los Array o Vectores el orden de almacenamiento ya sea en memoria o disco puede ser diferente al orden de recorrido, aún así el acceso a las listas solo puede ser secuencial a diferencia de los vectores que puede ser aleatorio es decir que las listas son más lentas que los vectores al momento de buscar una información específica
Tranquilos, estos conceptos en la práctica son mas sencillo de lo que parecen. Considero que tal vez pudieron ser mejor explicados pero bueno.
A continuación, les dejo dos repositorios con ejemplos de Estructuras de Datos e implementaciones de ADT en Kotlin y Java:
https://github.com/bmaslakov/kotlin-algorithm-club
https://github.com/kevin-wayne/algs4
Para entender mejor las queue imaginense una fila en el banco o en un supermercado donde la primera persona que llega es la primera que se despacha (que atienden y luego sale de la fila) , que es a la relacion que se hace con este ADT(Abstract Data Type) primero en entrar primero en salir
Para entender mejor las pilas (stacks) , imaginen que tienen una columna de libros , para sacar el del medio tienen que ir sacando libro por libro desde arriba (que fue el orden en que se ingresaron) no pueden llegar a ese libro sin sacar los de arriba
Espero hayan entendido mi aporte
#NuncaParesDeAprender
Me gustaría ver el uso de estos Data Types con casos reales.
Vale mencionar que en los Linked List su tamaño máximo definido como el que sea, este será limitado sólo por la RAM. Hasta que la agotemos, cosa que creo jamas queremos llegar 😃 . Aplicaría de igual manera para los otros ADT.
Pilas: (Ultimo en entrar, primero en Salir ) Permite almacenar Datos y recuperar Datos.
2.Tipos de Colas:
Ejemplo:
La lista (stack) va a ser super simple, como lo dice su nombre, es una estructura ordenada secuencialmente de elementos del mismo tipo (nombres, números, direcciones). Será ordenada secuencialmente (valor 1, valor 2, valor 3) y abajo vamos a tener un índice secuencial, y como es programación siempre vamos a comenzar en CERO.
Tiene sus acciones por ejemplo “GET” que te retorna al elemento de la posición dada, luego tenemos “INSERT” que te permite ingresar algo a la lista, y otras más
Luego tenemos las Pilas, y vamos a tener un elemento donde se almacena que pueden ser un array o un linked list, LIFO es su lógica, supongamos que guardamos letras. Empezamos a rellenar los datos de forma tal que la A se llena del último a llegar hasta el primero B,C,D,A.
En el Queue:
A,B,C,D,E,F,G. La G entró de última, entonces será la primera en salir. Aquí obviamente todas las letras se recorrerían y la F tomaría el lugar de la G, tendríamos un espacio nuevo disponible de primero.
Cuando el profesor dice, que la linked list es muy sencilla me recuerda lo que me costo aprender a implementarla en el curso de introducción al lenguaje C
Coincido con mis compañeros, es muy importante la implementación de ejemplos prácticos para que podamos aplicarlos de alguna manera. Además de un dibujo sería mucho mejor complementarlo llevándolo al código real.
Los ADT más importantes:
Importante: Para tener un sitio con muchos usuarios, no nos sirve un array, ya que este le definimos el tamaño al crearlo, para este caso se pude utilizar mejor un linklist ya que esto guarda el dato y tiene la dirección al siguiente dato y va creciendo.
¡AMO estos videos! Deberían de tener más videos así los otros cursos.
Esto hace que el video anterior quede más claro aún. ♥
Definitivamente quedo más claro
No he logrado conectar, es importante ver el ejemplo practico, next and let’s start
esperar a ver los ejemplos, en este punto es más complejo entender el significado y su funcionamiento.
Una aclaración: Los arreglos pueden tener un tamaño dinámico, es decir, ir teniendo el espacio que necesita el programa. Lo que pasa es que para agrandar un arreglo hay que copiar todos los valores uno por uno a otro lado de la memoria dónde el arreglo entre, lo cual es más lento que simplemente poner el nuevo dato en un lugar cualquiera de la memoria
en cuanto al array, les digo a todos de que podemos crear arreglos vacíos y luego llenarlos de acuerdo a las necesidades
No me queda clara la explicación del queue. Supuestamente es “First in first out”, pero en el ejemplo el último dato en entrar es el primero en salir. ¿Por qué?
Linked List: Cada elemento se vincula (Apunta) con el siguiente nodo, al no estar definidas de un inicio. las linked lists pueden tener el tamaño que sea. Ejemplo grafico:
Me pareció que se quedo un poco corta la explicación de los diccionarios y Linked list. Acá un poco para complementar.
Diccionario: estas estructuras de datos utilizan una clave para acceder al valor.
Por ejemplo: una agenda personal representada como diccionario la fecha sería la clave y las tareas o actividades serían los valores.
agenda={"lunes":tarea algoritmos, "martes":clase 1, "miércoles":clase 2} print(agenda)
Linked list: se compone de nodos y cada nodo contiene los datos de ese nodo y enlaces a otros nodos.
Diccionario: En los diccionarios los datos se encierran entre { }, Un diccionario es una estructura de datos y un tipo de dato en Python con caracateristicas especiales que nos permiten alcenar cualquier valor ya sea int, float, booleano, string, listas, funciones. Estos se identifican por una clave (Key)
Uso del diccionario: Para definir un diccionario, se encierra el listado de valores entre llaves. Las parejas de clave y valor se separan con comas, y la clave y el valor se separan con dos puntos
diccionario = {'nombre' : 'jose', 'edad' : 26, 'cursos': ['Python','Django','JavaScript'] }
Muy claro el tema, gracias por su excelente explicación.
Un poco más claro
Imagina una …
Lista como si manipularas una cadena de metal en la que puedes manipular sus eslabones a voluntad
Stack como un conjunto de platos uno encima de otro, así que para sacar los de en medio tienes que levantar primero los de arriba(FILO)
Queue como las filas que realizas para las compras, el cajero siempre atiende al primero que llegó(FIFO)
Map como un diccionario de lengua, es un conjunto clave(palabra del diccionario) y valor(su significado)
La lista es simple, es una lista ordena de elementos del mismo tipo, es ordenada de forma secuencial. Y abajo se tiene un índice secuencial que siempre comienza en cero.
<h3>Stack</h3>El stack almacena sus elementos en un array o linked list, y tiene la lógica de first in first out. Este tiene varias acciones como push que permitira agregar elementos al stack, pop permite sacar un elemento del top, parte más alta del stack. Pick que nos va a permitir visualizar el elemento para salir necesidad de ser removido, luego tenemos size, is empty and it is full.
Si se define un array para el stack se va a tener un tamaño pre definido para el mismo.
<h3>Queue</h3>La linked list a diferencia del array, el linked list se va a manejar a través de nodos y va a tener una dirección, que va de uno en uno, y nos permite tener “n” valores. Por que el array nos permite solamente tener un tamaño definido.
<h3>Mapa y diccionario</h3>Nos permite tener una colección de datos con un pequeño cambio que es un índice a medida, lo define el programador, no es secuencial exactamente. Su ventaja es que nos permite hacer consultas más rápido. Y se puede almacenar muchos valores.
Creo que el ejemplo de queue estuvo mal planteado.
import queue
import queue
q = queue.Queue(maxsize=3)
q.put('a')
q.put('b')
q.put('c')
print(q.get())
print(q.get())
print(q.get())
para mi estas estructuras fueron un dolor de cabeza en universidad, sobretodo aplicadas en C, recuerdo un programa de proyecto que teniamos que simular un tipo almacen de carros de n cantidad de niveles (pisos) con n cantidad de contenedores por cada piso y cada contenedor se meterian los carros, basicamente era una lista enlazada (pisos) anidada con una cola (lotes) que estaba anidada a una pila (donde se meten los carros)
Una critica constructiva: el contenido del curso, hasta el momento, me parece adecuado, sin embargo, explicaciones que requieren un apoyo visual deberían mejorarse, por ejemplo, para este caso, si el profesor sabe que no puede dibujar de una manera adecuada debería recurrir a apoyo multimedia, hacer garabatos en la pizarra puede generar distracción en el alumno, particularmente he visto algunos cursos en youtube sobre DS donde a nivel visual se explica mejor, incluso varios alumnos de Platzi veo que dejan gráficas muy informativas sobre esto, creo que en ese sentido el equipo de producción de Platzi debería apoyar para evitar que la explicación se sienta informal y hecha sobre el paso.
Comparto por acá un recurso sobre Abstract Data Types:
muy interesante 😄
Cool.
Y cual pueden ser los data type mas complejos?
Mucho mas entendible todo a partir de esta clase
No encontré el link de la lectura.
Esta clase es muy abstracta.
Abstrac Data Type más básicos e importantes
List = lista ordenada secuencialmente de elementos del mismo tipo, números, nombres, etc.
V0 V1 Vn
-------------------------- en orden desde 0
Stack = puede almacenar los datos en un array o linked list,
Vn V1 V0
<------------------------- de derecha a izquierda, el ultimo dato en ingresar es el último dato en salir
Queue = la primera letra en entrar va a ser la primera letra en salir
A B C D
------------------------------ salida
Sale la letra D y en el primer cuadro a mano izquierda quedaría libre un campo para guardar un nuevo dato
Dictionary y Maps = van a tener un índice siempre
Nos permite hacer consultas mas rápido, y también podemos agregar una dirección entera o un cliente completo como el que se creó anteriormente.
V0 V1 V2 Vn
K0 K1 K2 Kn
V= valor; K= índice
Linked list se crea uno por uno, por eso podemos tenerla del tamaño que queramos.
V -> V1 -> V2 ->
V = valor; -> = dirección de valor
Ok
Brutal, toma mucho sentido en diferentes lenguajes de programación. Muy buena clase profe.
that’s great thanks!
Con ejemplos o casos reales seria genial …
listo
explicación muy detallada y super entendible
Para separar la interfaz del TDA, es decir aquellas funciones y tipos que el programador “usuario” utilizará, de los detalles de implementación, vamos a utilizar los archivos headers de C. Es decir, los .h.
Interfaz: declarada en el archivo .h
Implementación: declarada en el .c
Y el programa de prueba o cliente deberá símplemente incluir el .h
Lista
Colección de bytes, tienen un indice secuencial.
Stack
LIFO - Last In, Frist Out
Queue
Primero que entra, primero que sale.
Diccionarios
Colección de datos con un indice definido por mi.
“Para llegar al cuarto item de un linked list, tienes que pasar por los 3 anteriores”
No lo se me pareció muy pobre la explicación… tengo que hacer consulta externa 😦
Repito con practica aprendo mejor!
Ese era el curso que me faltaba para entender a Pablo!
LIST [Lista]: Una serie ordenada secuencial mente de elementos similares. (Números, Letras, Colores, Comida, etc)
STACK [Pila]: El ultimo en entrar es el primero en salir.
QUEUE [Cola]: El primero que entra, es el primero que sale.
DICTIONARY [Diccionario]: También es una lista pero esta cuenta con un indice por espacio para identificar el valor almacenado.
Genial!!! graciasssss
Estas totalmente idoooooooooooooooo Padreeeeeeeeeeeeeee
Genial la clase, entendí varios conceptos 😄
Me gustaría ir un poco más a fondo con las LinkedList.
Mucho mejor!
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?