No puedo entender algoritmos y estructuras de datos. ¿Cómo puedo aprender algoritmos y estructuras de datos de una manera simple?

El título de la respuesta me llamó la atención porque me gusta la simplicidad y enseño CS, por lo que parece ser algo sobre lo que me gustaría escribir.

El comentario a esta pregunta dice que tiene 12 años y que comprende C ++, matrices, funciones y punteros. Mi primer comentario es que lo que sabes es probablemente C, no C ++, lo cual es algo bueno porque, y es solo mi humilde opinión, debes mantenerte alejado de C ++ al menos por un tiempo, si alguien dice una palabra sobre esto, puedes argumente que Linux está codificado en C y vea si alguien tiene un problema con eso.

Volviendo al tema … Si desea aprender sobre algoritmos y estructuras de datos, C es el mejor ejemplo de una máquina de puntero, que es la forma abstracta de decir que tiene un patio de juegos de estructuras de datos. Con la asignación de memoria y los punteros, puede construir cualquier estructura de datos, puede comenzar con listas vinculadas, luego listas enlazadas dobles, luego pilas, colas, colas dobles, colas prioritarias, etc. Incluso puede inventar sus propias estructuras de datos, eso está bien. Tengo varios descargos de responsabilidad sobre esto, pero primero necesito escribir algo sobre libros.

Es muy difícil para alguien que no lo conoce determinar lo que puede o no puede aprender, así que mi recomendación es que busque en Google y lea Wikipedia sobre las estructuras de datos que acabo de enumerar y cree sus propias versiones en C. Creo podrá comprenderlos bastante bien y, a medida que siga codificando y probando, podrá seguir buscando más estructuras de datos para jugar. Omita los que no entiende, vuelva más tarde para verificarlos.

Y ahora es el momento de comenzar mis renuncias.

Descargo de responsabilidad n. ° 1: Probablemente esta NO sea la forma correcta de aprender sobre algoritmos y estructuras de datos, pero la idea es permitirle aprender, si codifica muchas de esas estructuras de datos básicas, comprenderá bien la asignación de memoria, los punteros, persiguiendo pérdidas de memoria y muchas otras cosas que son realmente muy útiles.

“La práctica no hace la perfección, la práctica perfecta hace la perfección. Tenemos que practicar cómo practicar”.

Descargo de responsabilidad # 2: Nada (y no quiero decir nada) de lo que codifique ahora servirá para un propósito real en el futuro, tenga esto en cuenta al codificar, si necesita usar una de estas estructuras de datos sabiamente usará un biblioteca estándar; pero eso no significa que perderá su tiempo porque estoy 100% seguro de que el ejercicio mejorará sus habilidades de codificación y también mejorará su capacidad para comprender los temas.

Descargo de responsabilidad # 3: incluso si usa el STL, manténgase alejado de las listas vinculadas 🙂

Descargo de responsabilidad # 4: ¿Dije que debería mantenerse alejado de C ++ y usar C simple? Sí, dije eso antes. Yo lo mantengo.

Finalmente, un consejo importante: cuando codifica estructuras de datos que son comunes, lo está haciendo porque quiere aprender y no porque desea reinventar la rueda, pero no hay nada de malo en reinventar ruedas si le gustan las ruedas. Me gusta decir que si planeas hacer ruedas super duper en el futuro, primero debes comenzar a reinventar la rueda. Pero ese no fue mi consejo, el consejo es: use lápiz y papel mientras codifica para mantener sus estructuras claras de forma gráfica, asegúrese de saber siempre hacia dónde apuntan sus punteros y por qué, esté limpio primero, sea eficiente después.

Me doy cuenta de que he escrito una respuesta larga que probablemente solo tenga sentido para el OP, pero después de considerarlo, eventualmente podría ser útil para otra persona en su misma posición e incluso si ese no es el caso si fuera útil para alguien, entonces estoy contento con el resultado.

Que te diviertas.

Muchos de los algoritmos más básicos pueden entenderse por analogías con procesos físicos que ya sabes cómo hacer. Por ejemplo, ¿cómo busca una lista ordenada de palabras, como nombres en una guía telefónica? ¿Miras a través de cada nombre uno por uno? Tu búsqueda binaria.

El orden de inserción o de selección es lo que probablemente harías si te diera 30 fichas, escribiera un número en cada una y te dijera que las pusieras en orden.

¿Qué pasa si te doy cientos de documentos de estudiantes y te digo que los clasifiques por apellido? Probablemente pondrías todos los nombres que comienzan con A en una pila, B en otra, etc. Eso es básicamente una clasificación de radix.

¿Qué sucede si le doy un mapa que muestra todas las conexiones de vuelo posibles y luego le pido que determine la cantidad mínima de conexiones necesarias para llegar de una ciudad a otra? Esa es la primera búsqueda de amplitud.

¿Cómo encontrarías la salida de un laberinto, con una lata de pintura en aerosol para marcar los lugares que ya has visitado? Probablemente podrías resolver esto después de pensarlo un poco. Esa es la búsqueda de profundidad primero.

Creo que tienes la idea aquí. Esto te inicia en algoritmos básicos.

Las ideas para las estructuras de datos provienen de comprender cómo se almacenan los datos en la memoria de la computadora y luego descubrir cómo organizar los datos para que puedan actualizarse y buscarse de ciertas maneras específicas de manera eficiente. Escribí más sobre la intuición detrás de las estructuras de datos aquí: la respuesta de Eugene Yarovoi a ¿Qué son las estructuras de datos y por qué las usamos? ¿Cuál es su relación con los algoritmos?

Puede intentar pasar por los cursos Algorithmic Toolbox y Data Structures en nuestra Especialización. Tratamos de explicar todo desde el principio con ejemplos. Para evaluar y mejorar su comprensión, estos cursos tienen muchas tareas de programación.

Simplemente piense en los algoritmos como una caja que tiene un agujero donde puede colocar cosas para que sean procesadas por el algoritmo que las pasará por una serie de mecánicas (instrucciones) y generará una respuesta.

Una manera simple de pensarlo es pensar en un algoritmo que transformaría un punto 2d en un punto 3d.
Entonces, si tiene esa casilla, aceptaría un punto a con coordenada (x, y) y generará un punto a ‘con coordenada (x, y, z)
Otro ejemplo sería la calculadora de edad actual que dio su año de nacimiento y el año actual le daría su edad actual, por lo que sería así (pseudo código TIPL):
Entrada : birthYear, currentYear
Salida : currentAge
Ejecución :
1. Ingrese “año de nacimiento”, birthYear
2. Ingrese “año actual”, currentYear
3. currentAge = currentYear – birthYear
4. Imprima “You’re”, currentAge, “years old”

Para estructuras de datos, comience desde el más fácil, apilar / poner en cola, nodo, lista de nodos, conjuntos, … al más complejo: árbol nario, lista de doble enlace, mapas hash, conjuntos hash y siempre trate de relacionar cada concepto “abstracto” a los de la vida real, como una caja con una pila de libros donde tomas el primero ( L ast I n F firstst O ut), tu lista de descarga de canciones donde la primera canción se descarga primero y la última al final (Primero I n Primero O ut) y así sucesivamente.

Como cree que las estructuras de datos son complicadas, la mejor solución es seguir los videos en lugar de aprender a través del libro.

Puede ir a través de videos nptel o youtube para ver videos de estructuras de datos.

Son buenas fuentes para aprender.

Primero intente comprender los conceptos básicos claramente y luego intente codificar el algoritmo

Gracias

¡Feliz aprendizaje!

Al visualizarlos. Use lápiz y papel y un libro que use un lenguaje que pueda digerir fácilmente. CLRS es un buen recurso, pero no es para todos, especialmente para estudiantes autodidactas.

Use la taxonomía de la floración del aprendizaje para comprender nuevos conceptos. Los algos no son más difíciles que decir física o cálculo.

Primero, asegúrese de tener una buena comprensión de las matrices. Especialmente deberías poder describir una expresión complicada como a [2 * a [xy]]

A continuación, domine la Lista Singly-Linked. Debe entender cómo insertar, eliminar y buscar en una lista. Si puede entender cómo hacer una búsqueda recursiva, aún mejor.