Cómo comenzar a aprender o fortalecer mi conocimiento de estructuras de datos y algoritmos

Este es un recurso accesible en estructuras de datos, con implementaciones de muestra y excelentes explicaciones:

CPSC 223: Estructuras de datos y técnicas de programación.
El curso fue impartido por el Profesor James Aspnes, Director de Estudios de Pregrado del Departamento de Informática de Yale.

Tiene algunas notas fantásticas que ha creado y publicado en línea (es prácticamente un libro de texto), así como algunas tareas interesantes que te hacen probar y aplicar varias estructuras / técnicas de datos para resolver diferentes problemas.

Vista HTML:
Notas sobre estructuras de datos y técnicas de programación (CPSC 223, primavera de 2015)

Vista de PDF: http://www.cs.yale.edu/homes/asp…

Algunos temas cubiertos incluyen los siguientes:
Notación asintótica
Pilas
Colas
Deques
Listas vinculadas
Programación dinámica / Memoization
Tablas Hash
Árboles AVL
Splay Trees
Árboles de búsqueda binaria
Muchísimo
Árboles Aumentados
Gráficos / Búsqueda de profundidad primero / Búsqueda de amplitud primero
Algoritmos aleatorizados / Estructuras de datos (Saltar listas)
Varios algoritmos de clasificación (clasificación rápida, clasificación de raíz, clasificación de fusión, clasificación de montón, etc.).
Recursividad

Las notas también tienen una cobertura fantástica del lenguaje de programación C. Así es como aprendí a programar en C.

Creo que C es un gran lenguaje para aprender Estructura de datos / Algoritmos, porque hay que tener mucho cuidado con la gestión de la memoria. También es en general un lenguaje que todo informático debería saber.

¡Asegúrate de hacer los conjuntos de problemas! Implementar estructuras de datos es cómo mejorar en la comprensión de sus usos. Es importante poder elegir las estructuras de datos apropiadas para un problema determinado y diseñar las suyas propias combinando elementos de otras estructuras de datos.

Para ser claros, este no es un curso de algoritmos, ya que se centra principalmente en las estructuras de datos. El departamento ofrece el Diseño y Análisis de Algoritmos (CPSC 365) por separado, pero este recurso debería ser muy útil para la mayoría de las entrevistas de programación, ya que aprenderá sobre la notación asintótica y los tiempos de ejecución para la mayoría de los algoritmos / operaciones relacionados con las estructuras de datos en el curso. Además, ¡no te dejes intimidar por la longitud! Si conoce C, la parte de las notas en Data Structures tiene solo 180 páginas dispersas de LaTeX, con ejemplos de código también. Una gran parte es la revisión del lenguaje C. ¡Buena suerte!

* Todo el crédito va a James Aspnes, quien creó estos materiales y los publicó en su sitio web.

Hay muchos libros excelentes, recursos en línea y cursos en línea que le enseñan conceptos básicos de algoritmos y estructuras de datos. Los enumeraré a continuación:

Libros:

Introducción al algoritmo
Comúnmente conocido como CLRS, tomando la primera carta de cada uno de los coautores del libro. Uno de los algoritmos más completos del mercado. Tiene más de 1000 páginas de contenido, que cubren una amplia gama de temas.

http://www.amazon.com/Introducti

Diseño de algoritmo
Escrito por John Kleinberg y Eva Tardos. Otro gran libro de algoritmos. Cubre todo lo que el principiante en algoritmo tiene que aprender. En comparación con CLRS, este libro está más enfocado en enseñar lo esencial donde CLRS tiene un alcance más amplio.

http://www.amazon.com/Algorithm-…

Manual de diseño de algoritmos
Escrito por Steven Skiena. Este libro tiene un estilo muy singular. La segunda mitad del libro contiene un gran catálogo de algoritmos, que sirve como una gran referencia para resolver problemas algorítmicos. El libro cubre conceptos algorítmicos clave. Parte de la implementación del algoritmo se da en código C. En comparación con los dos libros anteriores, es mucho más corto en longitud.

http://www.amazon.com/Algorithm-…

Cursos online:

MIT 6.046J Introducción al algoritmo
Clase de algoritmo de nivel introductorio para estudiantes universitarios en el MIT. CLRS se utiliza como libro de texto para esta clase.

http://ocw.mit.edu/courses/elect

MIT 6.851 Estructuras de datos avanzadas
Esta es una clase de nivel de posgrado y es muy académica, por lo que no es para principiantes, pero es un gran recurso si desea aprender un concepto de estructuras de datos más avanzado.

http://courses.csail.mit.edu/6.8

Recursos en línea:

Tutorial de algoritmo de TopCoder
Este conjunto de excelentes tutoriales de algoritmos fueron escritos por varios competidores de TopCoder. Algunos de ellos cubren conceptos algorítmicos muy básicos, mientras que otros cubren conceptos muy pequeños pero útiles que no están cubiertos en ninguno de los otros recursos.

http://community.topcoder.com/tc

Todos estos son recursos muy genéricos que enseñan los conceptos básicos del algoritmo. Si está buscando un campo de algoritmo más específico, a menudo es útil buscar trabajos académicos que traten el tema.

Como siempre, la práctica hace al maestro. Cuanto más aprenda algoritmos, los visualice e intente implementarlos en situaciones de la vida real, más buceará en el mundo de los Algoritmos. Comience a desarrollar el pensamiento algorítmico visualizando algoritmos.
Esto es lo que recomendaré IDeserve
Es una plataforma genial donde puede visualizar los algoritmos y las estructuras de datos dentro de ella.
Siento que es la mayor fuente de algoritmos que puedes visualizar. Es genial ver algoritmos ejecutados y animados sobre la marcha.
Practique más y más y comenzará a visualizar los problemas más rápido.
Una vez más, no hace falta hacer más hincapié en esto, práctica.

Visualización de algoritmos en matriz
Algoritmo de clasificación – Clasificación de burbujas (Algoritmo de clasificación – Clasificación de burbujas)
Algoritmo de clasificación – Selección de selección (Algoritmo de clasificación – Clasificación de selección)
Algoritmo de clasificación – Clasificación de inserción (Algoritmo de clasificación – Clasificación de inserción)
Algoritmo de clasificación – Clasificación de montón (Algoritmo de clasificación – Clasificación de montón)
Algoritmo de clasificación – Ordenar fusión (Algoritmo de clasificación – Ordenar fusión)
Clasificación de panqueques (clasificación de panqueques)
Cuenta las frecuencias de los elementos de la matriz en el rango de 1 a n (Cuenta las frecuencias de los elementos de la matriz en el rango de 1 a n)
Encuentra todas las permutaciones de una cadena (Encuentra todas las permutaciones de una cadena)
Búsqueda binaria en una matriz ordenada (Búsqueda binaria en una matriz ordenada)
Líderes en una matriz (Líderes en una matriz)
Encuentra un elemento de pico en una matriz (Encuentra un elemento de pico en una matriz)
Buscar pivote en una matriz rotada ordenada (Buscar pivote en una matriz rotada ordenada)
Encuentre un elemento en una matriz rotada ordenada (Encuentre un elemento en una matriz rotada ordenada)
Buscar elemento en una matriz rotada ordenada sin encontrar un pivote (Buscar un elemento en una matriz rotada ordenada sin encontrar un pivote)
Encuentra duplicados en una matriz entera (Encuentra duplicados en una matriz entera)
Subarray promedio máximo (Subarray promedio máximo)
Suma máxima de subarreglos (suma máxima de subarreglos)
Siguiente elemento mayor en una matriz (Siguiente elemento mayor en una matriz)
Número de Fibonacci (número de Fibonacci)
Rotar una matriz (Rotar una matriz)
Buscar elemento mayoritario en una matriz (Buscar elemento mayoritario en una matriz)
Encuentra la mediana de dos matrices ordenadas (Encuentra la mediana de dos matrices ordenadas)
Primer carácter no repetitivo en una cadena (Primer carácter no repetitivo en una cadena)
Reorganice los elementos en una matriz para colocar elementos positivos y negativos en orden alternativo (Reorganice los elementos en una matriz para colocar elementos positivos y negativos en orden alternativo)
Encuentre el siguiente número mayor usando los mismos dígitos (Encuentre el siguiente número mayor usando los mismos dígitos)
Subcadena más larga con caracteres no repetidos (Subcadena más larga con caracteres no repetidos)
Dado un conjunto con todos los elementos distintos, encuentre la longitud del subconjunto más largo que tiene elementos (no en ningún orden particular) que podrían formar una secuencia contigua (Dado un conjunto con todos los elementos distintos, encuentre la longitud del subconjunto más largo matriz que tiene elementos (no en ningún orden en particular) que podrían formar una secuencia contigua)
Encuentra la ruta de costo mínimo en una matriz (Encuentra la ruta de costo mínimo en una matriz)
Encuentre la longitud de la subsecuencia creciente más larga en una matriz (Encuentre la longitud de la subsecuencia creciente más larga en una matriz)
Encuentre la subsecuencia creciente más larga en una matriz O (n logn) (Subsecuencia creciente más larga O (n logn))
Encuentre la longitud de la subsecuencia bitónica más larga en una matriz (Encuentre la longitud de la subsecuencia bitónica más larga en una matriz)
Encuentra el número total de formas de hacer cambios usando un conjunto de monedas dado (Encuentra el número total de formas de hacer cambios usando un conjunto de monedas dado)
Número mínimo de monedas para realizar el cambio (Número mínimo de monedas para realizar el cambio)
Cuente todas las decodificaciones posibles de una secuencia de dígitos dada – (Cuente todas las decodificaciones posibles de una secuencia de dígitos dada)
Encuentre la subsecuencia creciente de longitud tres que tiene el producto máximo (Encuentre la subsecuencia creciente de longitud tres que tiene el producto máximo)
Encuentre una subsecuencia creciente de longitud tres que tenga el producto máximo | Enfoque optimizado (Encuentre una subsecuencia creciente de longitud tres que tenga el producto máximo | Enfoque optimizado)
Encuentre el índice de 0 para reemplazar para obtener la secuencia continua más larga de 1s (Encuentre el índice de 0 para reemplazar para obtener la secuencia continua más larga de 1s)
O (n) enfoque de tiempo para encontrar el índice de 0 para reemplazar para obtener la secuencia continua más larga de 1s (O (n) enfoque de tiempo para encontrar el índice de 0 para reemplazar para obtener la secuencia continua más larga de 1s)
Encuentre una matriz entera correspondiente a la cadena que especifica las transiciones de aumento / disminución (Encuentre una matriz entera correspondiente a la cadena que especifica las transiciones de aumento-disminución)
Dado un conjunto con todos los elementos distintos, encuentre la longitud del subconjunto más largo que tiene elementos (no en ningún orden particular) que podrían formar una secuencia contigua (Dado un conjunto con todos los elementos distintos, encuentre la longitud del subconjunto más largo matriz que tiene elementos (no en ningún orden en particular) que podrían formar una secuencia contigua)
Fusiona dos matrices ordenadas sin usar espacio adicional (Fusiona dos matrices ordenadas sin usar espacio adicional)
Problema de mochila 0-1 (Problema de mochila 0-1)
El problema del horizonte (El problema del horizonte)
Buscar una matriz ordenada (Buscar una matriz ordenada)
Compra y venta de acciones – 1 (Compra y venta de acciones – 1)
Compra y venta de acciones – 2 (Compra y venta de acciones – 2)
Problema de la mina de oro (problema de la mina de oro)
Problema de distribución de chocolates (problema de distribución de chocolates)
Atrapar agua de lluvia entre torres (Atrapar agua de lluvia entre torres)
Buscar subarrays de longitud mínima con suma K (Buscar subarrays de longitud mínima con suma K)

Visualización de algoritmos en árboles
Compruebe si un árbol binario es un árbol de búsqueda binaria (Compruebe si un árbol binario es un árbol de búsqueda binaria)
Compruebe si dos nodos son primos en un árbol binario (Compruebe si dos nodos son primos en un árbol binario)
Eliminar todos los nodos que se encuentran en la ruta que tiene una suma menor que k (Eliminar todos los nodos que se encuentran en la ruta que tiene una suma menor que k)
Árbol de búsqueda binaria | Inserción y búsqueda (árbol de búsqueda binaria | Inserción y búsqueda)
Árbol de búsqueda binaria | Eliminación (Árbol de búsqueda binaria | Eliminación)
Recorrido de orden de nivel de árbol binario (Recorrido de orden de nivel de árbol binario)
Imprimir vista inferior de un árbol binario (Imprimir vista inferior de un árbol binario)
Imprima la vista inferior de un árbol binario usando un recorrido de orden de nivel (Imprima la vista inferior de un árbol binario usando un recorrido de orden de nivel)
Compruebe si un árbol binario está equilibrado o no (Compruebe si un árbol binario está equilibrado o no)
Compruebe si un árbol binario es un subárbol de otro árbol binario en el espacio O (1) (Compruebe si un árbol binario es un subárbol de otro árbol binario en el espacio O (1))
Compruebe si un árbol binario es un subárbol de otro árbol binario en el tiempo O (n) (Compruebe si un árbol binario es un subárbol de otro árbol binario en el tiempo O (n))
Compruebe si todos los nodos internos de BST tienen un solo hijo sin árbol de construcción (Compruebe si todos los nodos internos de BST tienen solo un hijo sin árbol de construcción)
Compruebe si un determinado árbol binario es simétrico o no (Compruebe si un determinado árbol binario es simétrico o no)
Compruebe si dos árboles de búsqueda binarios son idénticos dadas sus representaciones de matriz (Compruebe si dos árboles de búsqueda binarios son idénticos dadas sus representaciones de matriz)
Compruebe si dos árboles de búsqueda binarios son idénticos dadas sus representaciones de matriz | Conjunto 2 (Compruebe si dos árboles de búsqueda binarios son idénticos dadas sus representaciones de matriz | Conjunto 2)
Compruebe si el árbol n-ary dado es un árbol simétrico o no (Compruebe si el árbol n-ary dado es un árbol simétrico o no)
Compruebe si dos árboles binarios son idénticos (Compruebe si dos árboles binarios son idénticos)
Convertir un árbol binario en una lista doblemente vinculada (Convertir un árbol binario en una lista doblemente vinculada)
Convierta una lista doblemente ordenada en un árbol de búsqueda binaria equilibrada (Convierta una lista doblemente ordenada en un árbol de búsqueda binaria equilibrada)
Crear un árbol de búsqueda binaria equilibrado a partir de una matriz ordenada (Crear un árbol de búsqueda binaria equilibrado a partir de una matriz ordenada)
Compruebe si un árbol binario está completo o no (Compruebe si un árbol binario está completo o no)
Compruebe si un árbol binario es un árbol binario completo o no (Compruebe si un árbol binario es un árbol binario completo o no)
Construir árbol binario a partir de recorridos de orden y postorder (Construir árbol binario a partir de recorridos de orden y postorder)
Construir árbol binario a partir de recorridos en orden y preorden (Construir árbol binario a partir de recorridos en orden y preorden)
Construya el árbol binario a partir de su representación de matriz principal (Construya el árbol binario a partir de su representación de matriz principal)
Árbol AVL | Conceptos básicos (árbol AVL | Conceptos básicos)
Árbol AVL | Inserción (árbol AVL | Inserción)
Árbol AVL | Eliminación (árbol AVL | Eliminación)
Convertir árbol binario en árbol de búsqueda binaria (Convertir árbol binario en árbol de búsqueda binaria)
Encuentre la profundidad del nodo de hoja de nivel impar más profundo (Encuentre la profundidad del nodo de hoja de nivel impar más profundo)
Suma diagonal de un árbol binario. (Suma diagonal de un árbol binario).
Encuentre la altura del árbol binario desde su representación de matriz primaria (Encuentre la altura del árbol binario desde su representación de matriz primaria)
Encuentra la suma de todas las hojas izquierdas de un árbol binario (Encuentra la suma de todas las hojas izquierdas de un árbol binario)
Encuentre el piso y el techo de un elemento del conjunto de datos dado usando el árbol de búsqueda binario (Encuentre el piso y el techo de un elemento del conjunto de datos dado usando el árbol de búsqueda binario)
Recupere un árbol de búsqueda binaria si se intercambian las posiciones de dos nodos. (Recupere un árbol de búsqueda binaria si se intercambian las posiciones de dos nodos).
Sucesor en orden de un nodo en un árbol binario (Sucesor en orden de un nodo en un árbol binario)
Recorrido en orden de un árbol binario (Recorrido en orden de un árbol binario)
Imprimir vista izquierda de un árbol binario (Imprimir vista izquierda de un árbol binario)
Ancestro común más bajo de 2 nodos en un árbol binario (Ancestro común más bajo de 2 nodos en un árbol binario)
Profundidad mínima de un árbol binario (Profundidad mínima de un árbol binario)
Convertir un árbol binario en su árbol espejo (Convertir un árbol binario en su árbol espejo)
Convierta el árbol n-ary dado a su imagen especular (Convierta el árbol n-ary dado a su imagen especular)
Estructura de datos de Trie | Insertar y buscar (Estructura de datos Trie | Insertar y buscar)
Estructura de datos de Trie | Eliminar (Estructura de datos Trie | Eliminar)
Coincidencia de patrones usando Trie (Coincidencia de patrones usando Trie)
Coincidencia de prefijo más larga con Trie (Coincidencia de prefijo más larga con Trie)
Recorrido de orden posterior de un árbol binario (Recorrido de orden posterior de un árbol binario)
Pedido anticipado de un árbol binario (pedido anticipado de un árbol binario)
Imprima todas las rutas de raíz a hoja de un árbol binario (Imprima todas las rutas de raíz a hoja de un árbol binario)
Imprimir árbol binario en orden vertical (Imprimir árbol binario en orden vertical)
Imprima todos los nodos de un árbol binario que no tengan hermanos (Imprima todos los nodos de un árbol binario que no tengan hermanos)
Eliminar todos los medios nodos de un árbol binario dado (Eliminar todos los medios nodos de un árbol binario dado)
Eliminar los nodos del árbol de búsqueda binario que están fuera del rango dado (Eliminar los nodos del árbol de búsqueda binario que están fuera del rango dado)
Imprimir vista derecha de un árbol binario (Imprimir vista derecha de un árbol binario)
Serializar y deserializar un árbol de búsqueda binaria usando el recorrido de orden posterior (Serializar y deserializar un árbol de búsqueda binaria usando el recorrido de orden posterior)
Serializar y deserializar un árbol de búsqueda binaria (Serializar y deserializar un árbol de búsqueda binaria)
Encuentre el tamaño del BST más grande en un árbol binario (Encuentre el tamaño del BST más grande en un árbol binario)
Imprima la vista superior de un árbol binario usando el recorrido de orden de nivel (Imprima la vista superior de un árbol binario usando el recorrido de orden de nivel)
Imprimir vista superior de un árbol binario (Imprimir vista superior de un árbol binario)
Número total de posibles árboles de búsqueda binaria con n teclas (Número total de posibles árboles de búsqueda binaria con n teclas)
Dada una secuencia de palabras, agrupe todos los anagramas e imprímalos. (Dada una secuencia de palabras, agrupe todos los anagramas e imprímalos).

Visualización de algoritmos en cadenas
Word Break Problem (Problema de salto de palabra)
Invertir palabras en una cadena (Invertir palabras en una cadena)
Encuentra todas las permutaciones de una cadena (Encuentra todas las permutaciones de una cadena)
Encuentra la distancia mínima de edición entre dos cadenas dadas (Encuentra la distancia mínima de edición entre dos cadenas dadas)
Para imprimir el número máximo de As usando las cuatro teclas dadas. (Para imprimir el número máximo de As usando las cuatro teclas dadas).
Verificar paréntesis balanceados en una cadena (Verificar paréntesis balanceados en una cadena)
Distintas cadenas binarias de longitud n sin 1s consecutivos (Distintas cadenas binarias de longitud n sin 1s consecutivos)
Encontrar secuencias de ADN repetidas de 10 letras. (Encontrar secuencias de ADN repetidas de 10 letras).
Primer carácter no repetitivo en una cadena (Primer carácter no repetitivo en una cadena)
Agrupe todos los anagramas de una serie dada de cadenas | Conjunto 1 (Agrupe todos los anagramas a partir de una determinada serie de cadenas | Conjunto 1)
Subsecuencia común más larga (Subsecuencia común más larga)
Subcadena común más larga (Subcadena común más larga)
La secuencia palindrómica más larga (la secuencia palindrómica más larga)
Subcadena palindrómica más larga (subcadena palindrómica más larga)
Subcadena más larga con caracteres no repetidos (Subcadena más larga con caracteres no repetidos)
Palindrome Min Cut (Palindrome Min Cut)
Palindrome más corto (Palindrome más corto)
El cómputo de matriz de sufijo de prefijo más largo en el algoritmo de coincidencia de patrones KMP. (El cálculo de matriz de sufijo de prefijo más largo en el algoritmo de coincidencia de patrones KMP).
El algoritmo Knuth Morris Pratt para la coincidencia de patrones. (El algoritmo Knuth Morris Pratt para la coincidencia de patrones).

Visualización de algoritmos en listas enlazadas
Invertir una lista vinculada: iterativa (Invertir una lista vinculada: iterativa)
Invertir una lista vinculada – Recursiva (Invertir una lista vinculada – Recursiva)
Fusionar dos listas vinculadas ordenadas (Fusionar dos listas vinculadas ordenadas)
Buscar intersección de dos listas vinculadas (Buscar intersección de dos listas vinculadas)
Encuentre la intersección de dos listas enlazadas – O (m + n) Complejidad de tiempo y O (1) Complejidad espacial (Encuentre intersección de dos Listas enlazadas – O (m + n) Complejidad de tiempo y O (1) Complejidad de espacio)
Detecta un bucle en una lista vinculada y encuentra el nodo donde comienza el bucle. (Detecte un bucle en una lista vinculada y encuentre el nodo donde comienza el bucle).
Convertir un árbol binario en una lista doblemente vinculada (Convertir un árbol binario en una lista doblemente vinculada)
Convierta una lista doblemente ordenada en un árbol de búsqueda binaria equilibrada (Convierta una lista doblemente ordenada en un árbol de búsqueda binaria equilibrada)
Implementación de caché LRU (Implementación de caché LRU)

Visualización de algoritmos en gráfico
Algoritmo de Bellman-Ford (Algoritmo de Bellman-Ford)
Algoritmo de ruta más corta de Dijkstra (algoritmo de ruta más corta de Dijkstra)
Problema de círculos de amigos – Teoría de gráficos (Problema de círculos de amigos – Teoría de gráficos)
Clasificación topológica de un gráfico acíclico dirigido. (Clasificación topológica de un gráfico acíclico dirigido).

Visualización para algoritmos de programación dinámica
Word Break Problem (Problema de salto de palabra)
Encuentra la ruta de costo mínimo en una matriz (Encuentra la ruta de costo mínimo en una matriz)
Suma máxima de subarreglos (suma máxima de subarreglos)
Encuentra el número total de formas de hacer cambios usando un conjunto de monedas dado (Encuentra el número total de formas de hacer cambios usando un conjunto de monedas dado)
Número mínimo de monedas para realizar el cambio (Número mínimo de monedas para realizar el cambio)
Encuentre la longitud de la subsecuencia creciente más larga en una matriz (Encuentre la longitud de la subsecuencia creciente más larga en una matriz)
Encuentre la longitud de la subsecuencia bitónica más larga en una matriz (Encuentre la longitud de la subsecuencia bitónica más larga en una matriz)
Cuente todas las decodificaciones posibles de una secuencia de dígitos dada (Cuente todas las decodificaciones posibles de una secuencia de dígitos dada)
Para imprimir el número máximo de As usando las cuatro teclas dadas. (Para imprimir el número máximo de As usando las cuatro teclas dadas).
Encuentra la distancia mínima de edición entre dos cadenas dadas (Encuentra la distancia mínima de edición entre dos cadenas dadas)
Número total de posibles árboles de búsqueda binaria con n teclas (Número total de posibles árboles de búsqueda binaria con n teclas)
Problema de mochila 0-1 (Problema de mochila 0-1)
Subsecuencia común más larga (Subsecuencia común más larga)
Subcadena común más larga (Subcadena común más larga)
Subsecuencia creciente más larga O (n logn) (Subsecuencia creciente más larga O (n logn))
La secuencia palindrómica más larga (la secuencia palindrómica más larga)
Subcadena palindrómica más larga (subcadena palindrómica más larga)
Número de Fibonacci (número de Fibonacci)
Palindrome Min Cut (Palindrome Min Cut)
Palindrome más corto (Palindrome más corto)
Problema de suma de subconjunto (problema de suma de subconjunto)
Problema de la mina de oro (problema de la mina de oro)

Estaba en la misma situación hace 1 año y medio. Explicaré cómo aprendí la estructura de datos y los algoritmos.

En el siguiente texto, los algoritmos y la estructura de datos marcados en negrita son muy importantes. Aprenda cada algoritmo / estructura de datos con su complejidad de tiempo y espacio, estable, en su lugar y donde sea útil.

Que estudiar

Paso 0:

  • Comprender los punteros en C ++, estructuras o clases.
  • Aprenda a calcular el peor de los casos, el mejor de los casos, las complejidades promedio de los casos

Paso 1 :

  • Aprenda algunos algoritmos básicos de clasificación junto con su caso de uso y complejidad de tiempo.
  • Ordenamiento de burbuja
  • Tipo de inserción
  • Tipo de selección
  • Aprenda algoritmos de búsqueda junto con la complejidad del tiempo.
    • Búsqueda lineal
    • Búsqueda binaria

    Paso 2 :

    • Apilar
    • Cola
    • Lista enlazada individual (Insertar en el frente, atrás, en el medio; Eliminar en el frente y en el medio)
    • Lista doble vinculada
    • Lista circular vinculada

    Paso 3 :

    • Aprenda los siguientes enfoques en algoritmos
    • Divide y vencerás (algunos ejemplos son el orden de fusión , el orden rápido , la búsqueda binaria)
    • Método codicioso ( mochila , algoritmo de Prim, algoritmo de Kruskal, Dijkstra, Bellmanford )
    • Programación dinámica ( mochila 0/1, problema de vendedor ambulante , cambio de moneda )
  • Retroceso ( problema de N Queens )
  • Paso 4 :

    • Árbol binario
    • Árbol de búsqueda binaria
    • Altura de un árbol
    • Transversal del árbol
    • BFS
    • DFS
  • Buscando un elemento
  • Árbol AVL
  • Hashing
  • ¿De dónde estudiar?

    GeeksforGeeks | Un portal informático para geeks

    Estructuras de datos y algoritmos | Coursera

    Conferencias de video | Introducción a los algoritmos (SMA 5503) | Ingeniería Eléctrica e Informática | MIT OpenCourseWare

    Nota: Si se necesita una respuesta detallada o un enfoque específico, no dude en enviarme un mensaje sobre quora.

    ADVERTENCIA: esta respuesta puede parecer larga, pero contiene mis experiencias con este campo fundamental.

    El libro “Introducción a los algoritmos” (CLRS) mencionado en todas las publicaciones se considera biblia de este campo. Sin embargo, creo que si eres un principiante en este campo con una experiencia de programación moderada y un nivel matemático promedio, este libro podría tener una curva de aprendizaje de aprendizaje muy empinada que deberías evitar en este momento. No estoy diciendo que la curva de aprendizaje empinada sea mala, pero como principiante, su enfoque debe ser garantizar una comprensión intuitiva de los algoritmos junto con el conocimiento de implementar esos algoritmos en el idioma de su elección. Una vez que realice este paso correctamente, puede comenzar a profundizar en los detalles técnicos de varias estructuras de datos y algoritmos. Cuando comience a estudiar los detalles técnicos, “Introducción a los algoritmos” demostraría ser una guía y referencia invaluable. Una vez que estudie este libro por completo, debería poder comprender la mayoría de los editoriales de concursos algorítmicos: resolver uno solo necesitaría más que el conocimiento de algoritmos, necesita práctica. Pero ese es un tema para otra discusión.

    De todos modos, CLRS supone una buena cantidad de antecedentes por parte del lector. Si tiene un instructor excepcional que se encarga de la parte de la intuición y la implementación, entonces vaya a este libro. Pero si no tienes tanta suerte, te sugiero que comiences a leer Cómo resolverlo por computadora. Este es un libro escrito para personas como tú y yo que quieren entrar en este hermoso campo pero carecen de las armas en el arsenal para pasar las puertas de esta mansión. Además, este libro está escrito sin enfatizar ningún idioma y, por lo tanto, sigue un enfoque de pseudocódigo que es muy importante ya que funciona como una desintoxicación para todo el pensamiento “orientado al lenguaje” que hace que sea difícil pensar en problemas complejos porque estás demasiado concentrado en el lenguaje de programación que olvidas mirar el problema.

    Sin embargo, si no es muy fuerte en programación y necesita un libro que enseñe algoritmos al implementarlos en un lenguaje de programación, le recomendaría seriamente que Sams Teach Yourself Data Structures and Algorithms in 24 Hours: Robert Lafore: 978067231633g3: Amazon.com: Libros . Es un libro muy bien escrito con una explicación muy lúcida. Después de leerlo yo mismo, puedo garantizar la eficacia de este libro. No intentes terminar este libro en 24 horas. Tómese su tiempo para leerlo. Léelo detenidamente. No lo llevará lejos, pero hará que sus conceptos básicos en DS / Algo y C ++ sean muy fuertes. Si lees este libro, no creo que necesites el libro que mencioné anteriormente. Después de leer este libro, ve a CLRS. Tendrás el regalo de tu vida. Si eres una persona Java, entonces estudias Amazon.com: paquete de algoritmos en Java, tercera edición, partes 1-5: fundamentos, estructuras de datos, clasificación, búsqueda y algoritmos de gráficos (tercera edición) (Pts. 1-5) ( 0785342775785): Robert Sedgewick: Los libros harán que tu base sea muy fuerte. Sin embargo, toma una ruta rigurosa y le enseña muchos algoritmos. Para aprender estos temas en C, eche un vistazo a Algoritmos en C, Partes 1-5 (Paquete): Fundamentos, Estructuras de datos, Clasificación, Búsqueda y Algoritmos de gráficos (3a edición): Robert Sedgewick: 0785342756081: Amazon.com: Libros . No he estudiado esta serie, pero como el escritor es el mismo, la pedagogía debería ser similar. Además, los algoritmos son siempre los mismos. Es la implementación la que cambia, así que no se asuste si encuentra un algoritmo escrito en dos idiomas diferentes y no puede entender uno u otro.

    Primero, y lo más importante, los algoritmos y las estructuras de datos son solo una pequeña parte de ser un experto en programación.

    Tomaría un enfoque doble. Trabaje con las cosas de nivel superior que facilitan todo y le permiten sumergirse en algoritmos de nivel superior y otras cosas rápidamente. Pero también trabaje en el meollo de la cuestión.

    Primero, obtenga un lenguaje fácil con el que pueda comenzar rápidamente. Python es una buena opción. Use tutoriales como Python (codeacademy), y cuando quiera comenzar con algoritmos, mire un sitio como Sphere Online Judge (SPOJ) (vea ejemplos como “prueba” para evitar atascarse en problemas de entrada / salida). No codifique en un editor de texto sin formato; configure algo como PyDev para eclipse tanto para las funciones de depuración como para autocompletar, y solo para obtener más experiencia trabajando con software. Instalar y configurar software es una gran parte de ser un programador efectivo. Obtenga una copia de un libro de texto de algoritmos, por ejemplo este http://www.cs.berkeley.edu/~vazi … (ese es el sitio web del autor, por lo que es legítimo; otra buena opción es “CLRS”; googlearlo).

    Sin embargo, estos son solo pasos pequeños, aún no ha aprendido a programar de manera efectiva, acaba de aprender algunos de los aspectos básicos.

    Un buen próximo paso sería seguir cursos como los de aquí:
    La página de inicio de Jae Woo Lee, especialmente el “curso de programación avanzada. Desafortunadamente, faltan muchas cosas en el sitio web, pero lo importante es que lo guía a través del uso de Linux, un entorno muy importante para comprender y poder usar eficientemente, le brinda un mucha programación en C para hacer, “cerca del metal”, es decir, con una gran cantidad de abstracción expuesta a usted. También le presenta cosas como Sockets y crea cada aplicación una encima de la otra. Haría cosas como juzgar cuando para poner sus propias funciones en bibliotecas y también aprender a usar las bibliotecas integradas de manera efectiva (conocer las estructuras de datos es bueno, pero en la práctica casi nunca las implementará usted mismo; en su mayoría necesita comprender su comportamiento para usar bibliotecas existentes o ampliar ellos un poco).

    Lo que aprende a continuación depende de lo que quiera hacer, y de hecho, probablemente puede omitir la mayor parte de lo anterior si está haciendo cosas más centradas, por ejemplo, en diseñar una página web dinámica (pero no intensiva en datos). El trabajo de alguien que hace optimizaciones de kernel se elimina tan ampliamente del trabajo del programador web front-end típico como el trabajo de alguien que fabrica aceleradores de partículas se elimina de alguien que fabrica bicicletas.

    Sin embargo, si estás en un entorno universitario, tienes tiempo de sobra para aprender una gran variedad de cosas. Tome clases, trabaje duro, programe proyectos y no solo tareas, cree cosas, contribuya a proyectos de código abierto.

    Buena suerte.

    Actualización 17 de agosto :

    Ayer, alcancé el percentil 99 en algoritmos en Hackerrank en menos de 1 año, con realmente algo de trabajo de encendido / apagado durante varios meses, en realidad, el número de días para obtener esto es de 106 días, es decir, aproximadamente 3 meses.

    Si tengo que rehacer mi último año de trabajo, haría algunos como este:

    1. Lenguaje de programación
    1. Elegiría C ++ 14 con STL / Java sobre lenguaje C para ahorrar al menos 1/2 tiempo.
  • Actualizado el 17 de agosto : compraría y usaría una pizarra blanca (tamaño 2X3 pies) con plumero ( menos de 1200 rupias) al principio, 2 marcadores de pizarra blanca para escribir , tinta de recarga de marcador de pizarra blanca – 10 cajas de juego (aproximadamente 300 rupias, general, no la recarga de marcador permanente) para rellenar los marcadores según sea necesario.
    1. Esto fue crucial, porque los problemas difíciles necesitaban muestras de gran tamaño, en papel es factible pero es difícil, el pizarrón es perfecto, frota la parte del tablero y vuelve a dibujar. Esto fue especialmente útil para problemas de programación dinámica como LCS, LIS y sus variantes, que requieren tablas grandes. He resuelto problemas difíciles en DP solo porque tenía una pizarra blanca, sin pizarra blanca que no pude resolver, y fue una pesadilla inicialmente.
    2. Esto también es crucial para Game Theory, que estoy haciendo estos días, 18 de agosto de 2016.
  • Estructuras de datos antes de algoritmos
    1. Habría aprendido estructuras de datos, antes de hacer algoritmos
  • Un plan
    1. Si hubiera algo como a continuación, leería al menos 10 veces.
    1. La respuesta de Manohar Reddy Poreddy a ¿Cómo me convierto en uno de los diez mejores hackers en HackerRank?
  • Breeze lee todos los Tutoriales primero
    1. Aprender es más que hacer
    1. Me tomaría un descanso de 2 meses y aprendería todo lo que hay en el siguiente enlace: ManoharPoreddy / HackerRank-Topics
  • Un plan completo de principio a fin como el siguiente hubiera sido de gran utilidad:
    1. Recursos de CS y CP todo en uno por Manohar Reddy Poreddy en AlgorithmsAndMore
  • Trabajo duro continuo
    1. Finalmente hice mucho trabajo de encendido / apagado que se puede ver aquí
    1. En Envíos, puede ver el contenido completo de noviembre, febrero, marzo, abril y hasta finales de mayo, y el 1/2 de julio, no he trabajado en algoritmos
    2. Este tipo de trabajo de encendido y apagado es un error, tenemos que hacer un trabajo continuo para adelantarnos a la competencia, cada vez que tomé un descanso, mi rango retrocedió unos cientos, por lo que solo pude borrar ese retraso cuando volví a trabajar en algoritmos , permaneciendo en el mismo rango durante muchos meses en el año :-), no es una buena señal para trabajar duro de esta manera.

    Nueva actualización :

    Gracias por A2A.

    A medida que me acerco al Top 100, ahora en 116, estoy encontrando formas cada vez más refinadas y mejores de aprender DS & A, escribiré una mejor después de llegar al Top 100, puede ser dentro de un par de días.

    Por ahora, todo lo que puedo decir es a continuación, 3 pasos simples:

    Aprenda C ++ STL (no lenguaje C) o colecciones de Java

    Aprendí C ++ STL, desde aquí: std :: binary_search – cppreference.com

    Para problemas complejos, divídalos en subproblemas más pequeños, escriba 1 código de línea que resuelva 1 subproblema, por ejemplo, usando una función, de modo que en 1 página, pueda ver una solución completa del problema completo, de esta manera puede verificar fácilmente porque puede leer El código de un vistazo.

    2 horas: aprende un tema más cada día

    de ManoharPoreddy / HackerRank-Topics, y otros lugares, donde puedas aprender más rápido

    Cuanto más aprenda, mejor y más rápido podrá llegar al Top 100, es decir, los temas lo ayudarán a escribir un mejor código, ya que le brinda ideas únicas y diferentes para resolver el mismo problema, pero posiblemente con métodos más rápidos que ingenuos.

    2 horas: a medida que aprende cada uno de los temas anteriores, aplíquelos

    Encuentre una pregunta en un sitio web competitivo y resuélvala, o haga otras preguntas similares donde pueda aplicar el tema

    Esto determinará su comprensión sobre el tema, eliminará cualquier suposición incorrecta que haya hecho mientras aprendía y le hará recordar el tema durante mucho tiempo.

    cada vez que resuelves 3 preguntas, tu rango saltará más de 1000 rangos o más inicialmente hasta que alcances los 10K, más de 100 rangos más o menos, de esta manera aprenderás mejor y progresarás rápidamente hacia el Top 100.

    Algunos buenos libros (que nunca leí), consulte la sección “Libros” en Recursos de CS y CP todo junto de Manohar Reddy Poreddy en AlgorithmsAndMore

    la mejor de las suertes

    si tienes alguna duda en lo anterior, hazme un ping.

    Estructuras de datos y algoritmos (DSA para abreviar) es un curso basado en la implementación. Muchas empresas hacen hincapié en los conceptos de este curso en sus entrevistas. Para dominar este curso, debe ser fuerte con la teoría y la implementación de varias estructuras de datos y algoritmos.

    1. Leer Debería comenzar a leer Introducción a los algoritmos de Cormen et. todas. Se dice que este libro es el mejor para DSA, pero puede ser un poco difícil leerlo mientras trabajas con la carga de tu curso. En su lugar, puede usar esto como un libro de referencia que complementa su libro de cursos recomendado.
    2. Implemente las estructuras de datos sobre las que ha leído. Si bien leer sobre ellos puede darle una idea justa de que funcionan, es diferente de la implementación real, en la que tendrá que ocuparse de los casos límite. Habrá casos en los que olvide las comprobaciones nulas y arruine todo su código.
    3. Comprender la complejidad. Debe poder calcular la complejidad espacial de varias estructuras de datos, la complejidad temporal de sus operaciones y las complejidades temporales y espaciales de varios algoritmos. Debería poder juzgar qué algoritmo funciona mejor en diversas condiciones.
    4. Practica Resuelva problemas de varios jueces en línea como codechef, hackerrank, topcoder y spoj. Esto lo ayudará a elegir la estructura de datos óptima o algo para un problema en particular. Incluso puede buscar problemas específicos de la estructura de datos o algo que desee, pero ¿dónde está la diversión en eso?

    Además, también puede ver las conferencias en video del MIT sobre OCW o los cursos relevantes en Coursera

    Enlaces externos

    1. http://www.codechef.com/
    2. https://www.hackerrank.com
    3. http://www.topcoder.com/
    4. http://www.spoj.com/
    5. Introducción a los algoritmos: Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein: 9780262033848: Amazon.com: Libros
    6. Introducción a los algoritmos

    Siendo mentor en GoHired para DSA y con más de 30 estudiantes enseñados en DSA, creo que soy el perfecto para guiarte cuando quieres aprender desde cero
    Hay dos formas de hacerlo, una es el autoaprendizaje y la segunda es la tutoría.

    Autoaprendizaje (a largo plazo):

    1. Lo primero es que, comience a leer sus libros para c ++ o Java y practique cómo codificar para Array, Class (para Node, etc.), Collection (STL Library en c ++), etc.
    2. Comprender los fundamentos de todas las estructuras de datos, programación dinámica, algoritmos de videos en línea de Stanford o NPTL, etc.
    3. Comience a leer y desarrolle su pensamiento para preguntas lógicas en varios DS como Array, Tree, Trie From Books como Kurumanchi / entrevista de codificación de craqueo, etc.
    4. Vaya a HackerRank / Earth, CodeChef, geeksforgeeks y comience a practicar las mismas preguntas y respuestas de los temas.

    Tutoría (a corto plazo):

    1. Encuentre Good Mentor o institución de coaching en línea o cara a cara como en Tutorialspoint o GoHired (mi sitio) o Learnbay, etc.
    2. Comienza a aprender lógica a partir de ahí. En su mayoría, estos mentores explican cada tema desde cero, discuten varios problemas con usted y le brindan una “forma de pensar” para tales preguntas de DSA, incluso si surge una nueva pregunta, puede manejar tales preguntas en la entrevista (esta es mi forma de enseñar).
    3. Solicite a Consultores recibir carta de llamada para Amazon, Microsoft, etc.
      (Mentor también puede ayudarlo en eso, en el contrato de arrendamiento que hago con mis estudiantes)

    PD: Seguí el primer enfoque, y después de 6 a 8 meses pude cubrir todos los temas de DSA por mi cuenta hace unos años, como cuando lo haces por tu cuenta, necesitas demasiada motivación y empuje, lo que no obtendremos por tanto tiempo

    Siendo mentor en GoHired para DSA y con más de 30 estudiantes enseñados en DSA, creo que soy el perfecto para guiarte cuando quieres aprender desde cero.

    Hay dos formas de hacerlo, una es el autoaprendizaje y la segunda es la tutoría.

    Autoaprendizaje (a largo plazo):

    1. Lo primero es que, comience a leer sus libros para c ++ o Java y practique cómo codificar para Array, Class (para Node, etc.), Collection (STL Library en c ++), etc.
    2. Comprender los fundamentos de todas las estructuras de datos, programación dinámica, algoritmos de videos en línea de Stanford o NPTL, etc.
    3. Comience a leer y desarrolle su pensamiento para preguntas lógicas en varios DS como Array, Tree, Trie From Books como Kurumanchi / entrevista de codificación de craqueo, etc.
    4. Vaya a HackerRank / Earth, CodeChef, geeksforgeeks y comience a practicar las mismas preguntas y respuestas de los temas.

    Tutoría (a corto plazo):

    1. Encuentre Good Mentor o institución de coaching en línea o cara a cara como en Tutorialspoint o GoHired (mi sitio) o Learnbay, etc.
    2. Comienza a aprender lógica a partir de ahí. En su mayoría, estos mentores explican cada tema desde cero, discuten varios problemas con usted y le brindan una “forma de pensar” para tales preguntas de DSA, incluso si surge una nueva pregunta, puede manejar tales preguntas en la entrevista (esta es mi forma de enseñar).
    3. Solicite a Consultores recibir carta de llamada para Amazon, Microsoft, etc.
      (Mentor también puede ayudarlo en eso, en el contrato de arrendamiento que hago con mis estudiantes)

    ¿Cómo aprendo estructuras de datos y algoritmos desde cero?

    1.5 meses en programación competitiva? Agradable. Creo que ha estado resolviendo algunos problemas matemáticos y ad-hoc simples que requieren nada más que un poco de sentido común y algunas habilidades de implementación. Si ese es el caso, felicidades. Has dado el primer paso.

    Asumo lo siguiente.

    1. Todavía está aprendiendo estructuras de datos y algoritmos.
    2. Estás utilizando C ++ / Java como lenguaje de programación en concursos (te diré por qué vino aquí más adelante)

    Todos los pasos que menciono deben ir acompañados de práctica. No solo aprendas teoría.

    Aprendizaje de estructuras de datos y algoritmos. Algunos de ellos se pueden hacer en paralelo y espero que pueda identificar esas oportunidades. Esta será una respuesta larga.

    1. Como base, tienes que aprender matemáticas discretas. No es solo una base para el estudio de estructuras de datos y algoritmos, sino también para otros campos de la informática.
    2. Big-oh notación. Siendo una programación competitiva, saber esto es IMPRESCINDIBLE. Complejidades espaciales y temporales: esto es lo que importa mucho.
    3. Aprenda el funcionamiento de las estructuras de datos básicos. No tiene que implementarlos porque ya están en la biblioteca estándar de C ++ y Java. Pero conocer el trabajo ayuda. Es posible que deba modificarlos un poco para algunos problemas avanzados. La implementación de árboles de búsqueda binaria equilibrada, como los árboles rojo-negros, no es práctica durante los concursos. Proporcionaré los enlaces a recursos para aprender sobre estas cosas al final.

      Al principio, intente hacerse una idea de cómo funcionan las cosas. Tome un ejemplo, simúlelo a mano o use algún software interactivo para simular su funcionamiento. No te sumerjas en las matemáticas al principio. Si tiene problemas para comprender las pruebas, pero las comprende intuitivamente, puede visitar las pruebas otro día.

    1. Lista vinculada: java.util.LinkedList en Java y lista en C ++
    2. Matriz expandible (matriz de tamaño variable): java.util.ArrayList en Java y vector en C ++
    3. Pila, cola que proporcionan semántica LIFO y FIFO respectivamente – pila y cola en C ++. Puede usar LinkedList en Java.
    4. Colas de prioridad: PriorityQueue en Java y priority_queue en C ++. Esto se implementa con la estructura de datos del montón.
    5. Establezca – java.util.TreeSet y java.util.HashSet en Java. set y unordered_set son sus contrapartes de C ++. Aquí debes saber la diferencia entre ellos. Uno se implementa usando Árboles de búsqueda binarios balanceados y el otro se implementa usando una Tabla hash.
    6. Mapa: java.util.TreeMap y java.util.HashMap en Java. map y unordered_map en C ++. Son contenedores asociativos.
  • Bien, ahora conoce las estructuras de datos básicas y también su implementación en bibliotecas estándar. También estudie algunos algoritmos bien conocidos. Algoritmos como la ordenación se implementan como parte de la biblioteca estándar: Arrays.sort en Java y sort y stable_sort en C ++. También tiene implementadas rutinas de búsqueda binarias.

    No solo lo ayudan a completar la tarea con menos código, sino que también están bien probados. No tienes que probarlos. (No digo, no tienen errores. Podrían. Pero no te preocupes). Además, no reinventes la rueda.

  • Bien, ahora no solo conoce algoritmos básicos y estructuras de datos, sino también su implementación en bibliotecas estándar para que pueda aprovecharlos. Si desea saber más sobre ellos, puede explorar la documentación.
    1. http://www.cplusplus.com/
    2. https://docs.oracle.com/javase/8
  • Tarda unos meses. Te encontrarás con términos como Divide and Conquer (mientras estudias los algoritmos de fusión y ordenación rápida), programación dinámica (un poco aterradora. ¿Hu !?), fuerza bruta, retroceso recursivo, algoritmos codiciosos, etc.

    Estudie la solución de algunos problemas estándar en cada paradigma. Recuerde esta regla en la programación competitiva. Si piensa en una solución codiciosa, pero no pudo probarla, piénselo de nuevo. La intuición sale mal muchas veces aquí. Es por eso que necesitas estudiar pruebas. Es por eso que debe estudiar técnicas de prueba y aprender a probar sus afirmaciones.

    Por favor recuerde que NO son algoritmos. Son “paradigmas de diseño de algoritmos”. Tuve que mencionarlo porque otro día recibí una pregunta sobre la complejidad del “algoritmo de programación dinámica”.

  • Ahora dirígete a los algoritmos teóricos Graph. Necesita todo el conocimiento que aprendió antes. Aprenda algunos algoritmos estándar como MST, Shortest Path, DFS y BFS. Mantener flujos para otro día.
  • Felicitaciones por llegar tan lejos. Espero que también esté practicando en varios jueces en línea. Tienes que aprender muchas cosas sobre la marcha a partir de ahora. Este es solo el comienzo.

    1. Participe en concursos e intente resolver tantos problemas como sea posible.
    2. Después de los concursos, lea el editorial de problemas que no ha resuelto.
    3. Si involucra nuevos conceptos, apréndalos. Por lo general, los recursos para aprenderlos también se proporcionan en los editoriales. Si no, una búsqueda en Google te dará eso. Aprende la idea y aplícala.
    4. Resuelve los problemas no resueltos después del concurso (llamado upsolving).
    5. Lea el código de otros en caso de que no obtenga la solución presentada en el editorial. Por lo general, se proporcionan el código del instalador y del probador. Pero recuerde que los programadores competitivos generalmente no escriben código limpio, lo cual es un inconveniente.

    Aprende, aplica, practica, practica y practica. No pienses en ganar contra Gennady Korotkevich con pocos meses de práctica a menos que seas Chuck Norris o Rajnikanth 😛 (o alguien así).

    Para practicar, puede intentar resolver los primeros 200–300 problemas más resueltos en SPOJ. Las editoriales no están disponibles para ellos, aunque puede encontrar soluciones en Internet. Otra opción es Hackerrank y Codechef. Sus editoriales son muy buenos. Codeforces realiza muchos concursos cortos a menudo. Una vez que se sienta seguro, puede comenzar a participar en los SRM de TopCoder.

    Recursos para aprender estructuras de datos y algoritmos.

    1. visualizar estructuras de datos y algoritmos a través de la animación: use esta herramienta para comprender el funcionamiento de varios algoritmos y estructuras de datos. Esto incluye la simulación de algunos algoritmos avanzados y estructuras de datos también. Muy útil para programadores competitivos. Pero recomiendo simular a mano si es posible porque pensarás en cada paso del algoritmo.
    2. Algoritmos, Parte I – Universidad de Princeton | Coursera: este curso enseña algoritmos básicos y estructuras de datos que puede aprender en cualquier curso de algoritmos introductorios. Pero debes saber Java
    3. Algoritmos, Parte II – Universidad de Princeton | Coursera: este curso enseña algoritmos gráficos, tanto básicos como avanzados, programación lineal, algoritmo simplex y algunos problemas difíciles como encontrar si un gráfico es hamiltoniano. Completa las tareas en ambos cursos. Es divertido y merece la pena.
    4. Algoritmos | Coursera – de la Universidad de Stanford. Esta es una especialización de 4 cursos. Los dos primeros cubren estructuras y algoritmos de datos básicos. Los dos últimos cubren gráficos, NP-Hardness. A diferencia de los de Princeton, este curso no requiere que conozcas Java. Pero debe conocer al menos un lenguaje de programación.
    1. Divide y conquista, ordena y busca, y algoritmos aleatorios – Universidad de Stanford | Coursera
    2. Búsqueda de gráficos, rutas más cortas y estructuras de datos – Universidad de Stanford | Coursera
    3. Algoritmos codiciosos, árboles de expansión mínima y programación dinámica – Stanford University | Coursera
    4. Caminos más cortos revisados, problemas NP-completos y qué hacer con ellos – Stanford University | Coursera
  • MIT OCW – Matemáticas para la informática – Matemáticas discretas. Es necesario estudiar estructuras de datos y algoritmos.
  • MIT OCW – Introducción a los algoritmos (SMA 5503) – Esto sigue el plan de estudios “Introducción a los algoritmos”. Empecé con esto, pero me resultó un poco difícil. Algunas clases son impartidas por Charles Leiserson (“L” en CLRS).
  • MIT OCW – Estructuras de datos avanzadas.
  • GeeksforGeeks: útil si se está preparando para una entrevista.
  • InterviewBit – Todavía está en Beta. Pero me pareció bastante bueno para aprender lo básico.
  • USACO Training Program Gateway – Materiales de capacitación de USACO.
  • Algunos libros

    1. Introducción a los algoritmos (CLRS)
    2. Manual de diseño de algoritmos – Steven Skiena (Nota: no he probado este. Pero alguien lo sugirió en el comentario para alguna otra respuesta).
    3. Programación competitiva – 3 por Steven y Felix Halim. Este libro está dirigido específicamente a programadores competitivos. Si puede obtener este libro, simplemente sígalo.
    4. Algoritmos 4ta edición – por Robert Sedgewick y Kevin Wayne.

    Algunos recursos específicos para programadores competitivos.

    1. Tutoriales de ciencia de datos – Tutoriales de TopCoder
    2. MAXimal :: algo. Está en ruso. Usa el traductor de Google. Algunos artículos también se han traducido al inglés – Página principal – Algoritmos E-Maxx
    3. Estructuras de datos y algoritmos
    4. Impresionante recurso para DS y Algoritmos
    5. ¿Cuáles son los algoritmos “imprescindibles” para los concursos de programación en línea?

    También podría estar interesado en mis otras respuestas sobre este tema.

    1. Respuesta del usuario de Quora a ¿Cómo aprendo programación competitiva como principiante?
    2. Respuesta del usuario de Quora a ¿Cómo empiezo a aprender o fortalecer mi conocimiento de estructuras de datos y algoritmos?
    3. Respuesta del usuario de Quora a ¿Cómo puedo mejorar mi pensamiento algorítmico para la programación competitiva en poco tiempo? ¿Cuáles son algunos recursos?
    4. Respuesta del usuario de Quora a ¿Qué tipo de matemáticas tendré que aprender para ser un buen programador competitivo? Estoy enfrentando problemas al resolver problemas en línea usando matemáticas relacionadas con C ++, especialmente problemas de gráficos de geometría como polilínea, etc.

    Hff! Eso fue largo y me disculpo por eso. Gracias por su paciencia.

    Buena suerte. Feliz codificación 🙂

    Para empezar, un edificio nunca puede sostenerse sin una base. Ciertamente, las estructuras de datos y los algoritmos son la base de todos los lenguajes de programación y, por lo tanto, es algo que debe aprender … C / Java / Python es el edificio y las estructuras de datos / algoritmos son la base …

    Para decirlo matemáticamente, estructuras de datos + algoritmos = programa

    Ya es hora de comenzar a aprender estructuras de datos y algoritmos … Entonces, veamos cómo abordar las estructuras de datos y los algoritmos …

    Entonces, ¿qué es una estructura de datos?

    En ciencias de la computación, una estructura de datos es una forma particular de organizar los datos en una computadora para que puedan usarse de manera eficiente.

    Ejemplo: matrices, listas enlazadas, pilas, colas (estructuras de datos lineales); Árboles, gráficos (estructuras de datos no lineales)

    ¿Y qué es un algoritmo?

    Un algoritmo es un procedimiento o fórmula para resolver un problema.

    ¿En qué temas debe enfocarse cuando aprende estructuras de datos y algoritmos?

    Estructuras de datos:

    • Conceptos básicos de estructuras de datos
    • Estructuras de datos lineales
      1. Matrices
      2. Listas vinculadas junto con listas circulares y doblemente vinculadas
      3. Pilas con análisis de expresiones
      4. Colas con colas circulares y colas
      • Estructuras de datos no lineales
        1. Gráficos con DFS, BFS, Prims, Kruskals, Bellman Ford Algorithms
        2. Árboles con recorrido, árboles de búsqueda binaria, árboles B, árboles B +, árboles AVL, árboles de expansión, árboles rojos negros y montón
        • Técnicas de clasificación: clasificación de selección, clasificación de burbujas, clasificación de inserción, clasificación rápida, clasificación de fusión, clasificación de montón, clasificación de shell, clasificación de cubeta, clasificación de radix
        • Técnicas de búsqueda: búsqueda lineal, búsqueda binaria, búsqueda de interpolación
        • Colisión con Hashing
        • Recursividad

        Algoritmos

        • Análisis asintótico
        • Teorema maestro
        • Algoritmos codiciosos
        • Divide y conquista algoritmos
        • Algoritmos de rama y ligados
        • Programación dinámica
        • NP Hard y NP Complete Problems

        ¿Cuáles son algunos buenos recursos para estudiar estructuras de datos y algoritmos?

        • Estructuras de datos de Seymour Lipschutz
        • Estructuras de datos con C por Seymour Lipschutz
        • Estructuras de datos con C por Yashawant Kinetkar
        • Introducción a los algoritmos por Charles E. Leiserson, Clifford Stein, Ronald Rivest y Thomas H. Cormen

        Prefiero pasar por el primer, segundo y cuarto libro. Estos son los mejores.

        ¿Cuáles son algunos trucos para dominar las estructuras de datos y los algoritmos?

        • Lee un capítulo. Entiendelo. Subraya las partes que no entiendes. Leelo de nuevo. Si aún tiene dudas, busque en la red, revise los videos de Neptel de Youtube o publique en quora para obtener respuestas de profesionales.
        • Una vez que sea minucioso, comience a resolver los números que figuran al final del capítulo. Si está atascado, lea el concepto nuevamente e intente. Si aún no puede resolver, pida ayuda a profesionales. También revise los números disponibles en línea o en exámenes competitivos (GATE / PSU: Made Easy y TMH son los mejores) libros.
        • Ahora, implemente los programas para cada estructura de datos y algoritmo, cuyos números ha completado.
        • Una vez que esté seguro con un capítulo, pase al siguiente. Pero no olvides revisar el capítulo anterior después de 15 días. Compruebe si todavía tiene la misma confianza en ese capítulo que antes.

        Siga las cosas escritas anteriormente y estoy seguro de que será un maestro en estructuras de datos y algoritmos dentro de un mes …

        Si aún tiene dudas, consulte mi respuesta:

        La respuesta de Arundhati Kanungo a ¿Es posible comprender las estructuras de datos cuando solo tengo conocimientos básicos de programación?

        La respuesta de Arundhati Kanungo a ¿Cómo empiezo a aprender o fortalecer mi conocimiento de las estructuras de datos y algoritmos?

        La respuesta de Arundhati Kanungo a ¿Es necesario unirse al coaching de estructura de datos?

        Descubra los requisitos previos (temas que debe conocer en C) para aprender estructuras de datos y algoritmos desde aquí:

        La respuesta de Arundhati Kanungo a ¿Cómo ser inteligente en lenguaje C?

        ¡¡¡Disfruta aprendiendo!!!

        Gracias por el A2A 🙂

        En breve:

        Código, código y código. No hay sustituto para la práctica de programación.

        En detalle:

        Según yo, no es necesario prepararse para las ubicaciones inmediatamente después del segundo año. Recomendaría lo siguiente para ayudarlo a convertirse en un mejor programador en lugar de simplemente ayudarlo a realizar entrevistas.

        • Encuentra tu pasión:

        El desarrollo de aplicaciones y la programación competitiva son 2 flujos principales de programación.

        Puede probar ambos o elegir cualquiera según su interés.
        Por ejemplo, estaba interesado en el desarrollo web en mi primer año, así que durante mi primer año comencé a aprender desarrollo web durante las vacaciones de verano (PHP, HTML, Javascript) para crear un sitio web para mi clase en el que los representantes de la clase y los maestros pueden publicar tareas, horarios y otras actualizaciones. ¡Aprender cosas haciéndolas es muy efectivo!

        Nota: El conocimiento del desarrollo de aplicaciones siempre te ayudará a terminar tus proyectos académicos. Si está interesado, también puede hacer proyectos no académicos. Todo esto ayudará a construir su currículum.

        • Nunca pienses que el desarrollo de aplicaciones no involucra algoritmos.

        Por ejemplo, yo (junto con algunos otros) creé una aplicación de Chrome para autenticación sin contraseña basada en un algoritmo RSA. A través de eso, llegué a saber cómo funcionaba la autenticación utilizando un algoritmo RSA.

        Más tarde, en mi segundo año, comencé a resolver problemas en Spoj y también me pareció interesante, y así comenzó mi viaje en la programación competitiva. Esto realmente me ayudó a desarrollar mis habilidades algorítmicas.

        Incluso si no encuentras una pasión, ¡no dejes de codificar! Jessica Su ha presentado su punto de vista sobre esto en una de sus respuestas:

        Algunas personas piensan que todos los que codifican deben ser apasionados, y las personas que no codifican por diversión no pertenecen al campo. Creo que es una tontería, y puedes ser un programador perfectamente bueno sin vivir y respirar tu trabajo. Pero aún necesita hacer un esfuerzo concertado para ganar experiencia y ser sólido en sus fundamentos.

        • Hackea tu mente:

        Es muy importante tener confianza al resolver problemas de programación. Por ejemplo, puede tener la actitud de que nunca puede resolver un problema de DP. Solo tienes que dejarlo ir hackeando tu mente. Más tarde, intente hacer el mismo problema de DP (seguramente lo resolverá o al menos lo resolverá parcialmente). Por lo tanto, es importante tener una actitud positiva cuando practicas la programación.

        • Crea un panel de discusión:

        Comience un grupo de discusión en Quora o Facebook y agregue a sus amigos. Siempre es mejor discutir problemas en lugar de hacerlo solo. Obtendrá diferentes tipos de respuesta que lo ayudarán a resolver el problema en cuestión utilizando diferentes enfoques.

        Tenga una sesión de “Pregunta del día” o manténgase actualizado constantemente con preguntas interesantes.

        • Trabajar en una startup:

        Practique en una startup si no tiene una pasantía en una empresa establecida. Según lo que he escuchado de muchos de mis amigos y personas mayores, las pasantías técnicas le brindan una excelente experiencia de programación y agregan valor a su currículum. Aprenderá sobre muchas herramientas y tecnologías de programación interesantes.

        Durante el verano de mi segundo año, recibí una oferta para realizar una pasantía en una startup, pero dejé esa oportunidad debido a mi horario universitario (solo un mes de vacaciones de verano). No creo que sea tu caso. Tienes 2 meses Por lo que escuché, muchas startups no tienen un período de contratación programado. Puede aplicar en cualquier momento que desee (incluso durante el comienzo de su verano), y si tiene un currículum impresionante, puede recibir una oferta inmediata para realizar una pasantía.

        • Asistir a un MOOC:

        Coursera, Udacity y muchos sitios similares ofrecen MOOC ( cursos en línea masivos abiertos en línea) en muchos campos de la computadora, como algoritmos, inteligencia artificial, base de datos, etc. Regístrese para estas clases e intente resolver sus tareas también (no sirve para registrarse).

        • Preparación para la entrevista de pasantía:

        Si las empresas visitan su universidad para reclutar pasantes, haga todo lo posible para obtener una oferta. Planifique en consecuencia y comience a prepararse.
        La mayoría de las entrevistas de pasantías evalúan sus conceptos básicos en codificación, algoritmo y estructura de datos. Intenta resolver preguntas de entrevista de muestra. Por favor, no pase unas vacaciones de verano completas solo para la preparación de la entrevista. No creo que sea necesario.

        Un conocimiento decente sobre algoritmos y estructura de datos junto con una habilidad de codificación impecable te traerá un pasante seguro.

        Todo lo mejor. 🙂

        La perspectiva de un programador competitivo.

        • Lea los siguientes libros: Algorithms by Sedgewick, Introduction to Algorithms by Cormen et al.
        • Lea los Tutoriales de Algoritmo de TopCoder. Grita a Michal Forišek ( misof ) y Dima Korolev ( DmitryKorolev ).
        • Resuelva los problemas en el Portal del Programa de Capacitación de USACO.
        • Resuelve problemas en jueces en línea y compite en concursos de programación. Para las estructuras de datos en particular, en mi experiencia, las OI de Europa Central / Oriental tienden a tener los problemas más interesantes. Para los algoritmos, intente resolver problemas de una variedad de fuentes diferentes para que pueda aprender a aplicar tantos tipos diferentes de algoritmos como sea posible.

        Trabaja a tu propio ritmo y pide ayuda si tienes problemas.

        En definitiva, todos tienen sus propias estrategias de aprendizaje. Tendrás que descubrir qué funciona para ti. Lo más importante es mantenerse motivado y seguir trabajando en ello. Pero si se aburre de los algoritmos de aprendizaje y las estructuras de datos, vaya a hacer otra cosa.

        [Presentado en Quora FB]

        Las estructuras de datos y los algoritmos son difíciles de aprender. Aquí hay una lista enorme para mostrar cuánto hay en realidad: estructuras de datos y algoritmos.

        Entonces, ¿cómo se mejora esto?

        Dominar estas cosas requiere dos cosas: comprensión e implementación . Aquí hay algunos pasos a seguir.

        # 1 Lea sobre las estructuras de datos / algoritmos. Te he dado una buena lista de cosas para estudiar, pero esto no la obtendrá por completo. Aquí hay otro enlace para encontrar listas de algoritmos: ¿Cuáles son los algoritmos necesarios para resolver todos los problemas (usando C ++) en cualquier concurso de codificación competitivo?

        • Obviamente, esto no cubre todo. Leer el libro de algoritmos CLRS también será muy bueno.
        • Libros de algoritmos: si CLRS se considera un libro bastante difícil para principiantes, ¿qué otro gran libro recomendaría para principiantes?
      1. Verá que leer sobre algoritmos y estructuras de datos es algo así como la oferta y la demanda . Cuantos más problemas hagas, más algoritmos tendrás que estudiar.
      2. No es necesario implementarlo de inmediato. Asegúrese de comprender los detalles de
        las estructuras de datos / algoritmo, de modo que si hay un pequeño giro en un problema, podrá recogerlo inmediatamente y saber dónde cambiar su código en su estructura de datos o algoritmo. Recomendaría escribir los pasos en una hoja de papel y ser la computadora y hacer cada paso del algoritmo o cada parte de la estructura de datos a mano .
      3. # 2 Practica, practica, practica. Esto debe hacerse simultáneamente con el n. ° 1. Nunca solo hagas el n. ° 1 o n. ° 2 ; Esto no te ayudará. Debe implementar Y aprender cómo funciona el algoritmo, para poder ajustarlo como quiera.

        • Hay tantas plataformas de codificación en línea: ¿Cuáles son los diversos concursos de programación en línea?
        • Aquí están los que yo diría que se centren:
        • CodeForces (estructuras de datos): capacidad de mirar las soluciones de otras personas, concursos semanales, no hay escasez de problemas, la mayoría de los problemas tienen editoriales
        • HackerRank (dominio de algoritmo): similar a CodeForces, capaz de ver las soluciones de otras personas, la mayoría de los problemas tienen editoriales
        • HackerEarth (pista de estructura de datos recientemente lanzada): muchos problemas, además de editoriales (tienen que desbloquear)
        • Otros: páginas de capacitación de USACO, problemas pasados ​​de USACO, HackerEarth, TopCoder, SPOJ *, CodeChef *, jueces en línea *
        • * soluciones y editoriales son raros en estos casos, tendrá que buscar en Google o hacer preguntas

        # 3 Implementar. Prepare un código de trabajo y depúrelo si es necesario. Debería poder mirar su hoja de papel y codificar la estructura de datos / algoritmo de manera bastante simple. Si se atasca, es posible que haya entendido mal la estructura del algoritmo / datos ( Regrese al paso 1 ) o consulte un pseudocódigo (ya sea en Codechef o HackerEarth Code Monk o los tutoriales de TopCoder, etc.).

        • Algunos tutoriales sobre estructuras de datos de los que puede aprender.
        • Tutoriales de ciencia de datos (pseudocódigo)
        • Estructuras de datos y algoritmos (enlace anterior)
        • Code Monk – Sé un mejor programador o Notas sobre HackerEarth (en muchos idiomas diferentes)
      4. Estudiar las estructuras de datos se trata de comprenderlas, no solo de implementarlas. Esto se debe a que cambiar las estructuras de datos para ajustarse a una pregunta requiere que comprenda cómo funciona. Por lo tanto, no importa en qué idioma se codifique la estructura de datos; solo trata de entenderlo haciéndolo a mano.
      5. Del mismo modo, trate los algoritmos de la misma manera. Los enlaces están arriba para practicar. Algunos enlaces de referencia (¿tal vez ayuda?): Algoritmo | Código aceptado
      6. # 4 No pares incluso si te quedas atascado. Obtenga ayuda de inmediato. Realice uno o varios de los siguientes:

        • Intenta encontrar las soluciones de otras personas o lee el editorial. Obtenga la idea principal de la solución. Ahora CIERRE la solución e implemente su sin leer la solución nuevamente . Esto es bastante importante, para que el algoritmo / solución se hunda en tu cabeza. Es por eso que te di algunos sitios web para usar arriba. Tienen editoriales, lo que ayuda mucho.
        • Todos los problemas de codificación tienen patrones. Siempre verá problemas similares todo el tiempo. Por lo tanto, las estrategias y algoritmos que utilizó también pasarán por alto. Recuerde palabras clave que afectan a un algoritmo. Esto jugará un papel importante en su éxito como codificador competitivo.

        # 5 Haz concursos (por diversión si no eres un programador competitivo) . No hay mejor práctica que los concursos reales. Los concursos ayudan con su capacidad de contener su estrés y pondrán a prueba sus fortalezas al máximo. Después de cada concurso, asegúrese de resolver todas las preguntas que no resolvió durante el concurso. Esta es una clave importante.

        # 6 Diviértete . Realmente no puedes ser bueno en algo si no te gusta. ¡Entonces Diviertete!

        Este fue un desglose realmente intenso de los algoritmos / preparación de la estructura de datos para la programación competitiva, pero la idea de solo aprender algoritmos y estructuras de datos aún se aplica. El punto es practicar y practicar con los recursos adecuados. Buena suerte.

        Respuestas relacionadas:

        • ¿Cuál es la mejor manera de practicar con algoritmos y estructuras de datos?
        • ¿Cómo debo aprender los algoritmos y resolver problemas en CodeChef, SPOJ paso a paso?
        • ¿Cómo puedo mejorar mi estructura de datos y mi conocimiento de algoritmos? Puedo dar 2 horas al día.

        Sígueme a mí y a mi blog para obtener respuestas de programación más competitivas 🙂

        Descargo de responsabilidad: de ninguna manera es una guía completa, pero si es un principiante, incluso sin ningún conocimiento de C / Java, supongo que esto lo ayudará a enfrentar las ubicaciones. Sin embargo, se recomienda hablar con más personas y recibir múltiples aportes y hacer una estrategia que se adapte a usted.
        Paso 1: idioma
        Incluso si no tiene conocimiento de ningún idioma, no debe preocuparse. Le sugiero que comience con C. También puede optar por Java (que tiene sus propias ventajas), pero llevará más tiempo que C.
        Si está comenzando con C, primero visite http://www.cprogramming.com . Mira todas las video conferencias. Lea el libro Let Us C. Hágase minucioso con conceptos como matrices, cadenas, macros y particularmente punteros. No se preocupe por las estructuras de datos (listas enlazadas, pilas, colas y árboles) en este momento.
        Paso 2: DSA (estructuras de datos y algoritmos )
        Estructuras de datos y algoritmos simplificados 2ª edición –
        Aquí está el enlace de Flipkart al libro: Estructuras de datos y algoritmos simplificados por Narasimha Karumanchi. (Esto está escrito en C. Si en el paso 1 preparó Java, este libro también está escrito en Java).
        Ahora este libro debería ser su biblia / quran / gita para su preparación de TI. Lea los primeros 6 capítulos. Serán Complejidad de tiempo, Recursión, Listas vinculadas, Pilas, Colas y árboles. Lee estas cosas dos veces. No se limite a asaltar, sino que intente comprender los conceptos. No asaltes el código. Sí, mucha gente hace eso. Ahora, después de terminar estos 6 capítulos, lea el hash (capítulo 14) y busque, clasifique los algos del mismo libro (hasta este punto, todo es obligatorio. El siguiente párrafo es opcional).
        No es necesario leer algos de cuerda, pero si el tiempo lo permite, ¿por qué no lo haces? La programación dinámica, la teoría de gráficos no son realmente necesarias a menos que aspire a grandes personajes como Microsoft, Amazon y DirectI.
        Ahora puede parecer tanto estudiar, pero no es así. De todos modos, trate de ser extremadamente minucioso con estos conceptos.
        NOTA: A menos que esté escribiendo código, todos sus esfuerzos pueden resultar inútiles. Así que instale un compilador y codifique un problema todos los días ( eso es 10 minutos al día ) . Esto te ayudará a depurar rápidamente. Esto es imprescindible. También puede registrarse en sitios como SpoJ / Code Chef para codificar de manera eficiente (Mejor complejidad del tiempo. ¿Suena extraño? No se preocupe. Hablará mucho sobre la complejidad del tiempo en el futuro. Es algo muy pequeño)
        Paso 3: Ahora tiene suficiente conocimiento de codificación, pero las compañías de TI esperan un poco de conocimiento en áreas como DBMS, OS y OOP. Puede estudiar todos estos temas de las conferencias en video de NPTEL realizadas por IIT. Si bien estas conferencias le brindan cantidades extremas de conocimiento, son dolorosamente lentas. Personalmente, no vi mucho NPTEL.
        DBMS : Este es un tema muy interesante y muy fácil. Te aconsejo que aprendas esto mientras aprendes C ¿Dónde estudié DBMS? Coursera
        Tendrás que aprender SQL cuando estudies DBMS. Fuente: Tutorial SQL
        Sistema operativo: No puse mucho esfuerzo en el sistema operativo. Pero te aconsejan que lo hagas. Aprendí lo poco que hice de Tutorial del sistema operativo Iniciar OS después de que termine DSA.
        OOP: puede aprender OOP de los últimos tutoriales para LISP, jQueryUI, QC, D Programming, JCL, Computer Programming, Cloud Computing … Ahora, si solo has estudiado C hasta ahora, es hora de leer un poco de Java. Esto no es obligatorio sino solo para estar más seguro. Existen numerosas fuentes para aprender Java. Recomiendo tutoriales de Java con conferencias de Bucky Robertsvideo por Bucky Roberts (un lapso total de aproximadamente 12 horas). Alternativamente, puede leer Head First Java. Ahora este libro no es como otros libros que estudiaste toda tu vida. Es como una novela y te hace reír muchas veces como esta respuesta 😛

        Ok, espero que ahora tengas todo lo que se espera de ti en las ubicaciones. Oh espera. La aptitud sigue ahí. No tiene que prepararse para CAT / GRE para la aptitud de colocación. En general, la aptitud de colocación es muy fácil. No te confíes demasiado ahora. Todo lo que necesitas es algo de velocidad. Al mismo tiempo no hay margen de error en Apti. http: //www.indiabix.com es muy recomendable para la aptitud. Muchas de las preguntas de este sitio son levantadas por las compañías.

        También hable con otras personas mayores sobre el contenido de esta respuesta y su estrategia para las ubicaciones y tome su decisión final. ¡La mejor de las suertes!

        Puede comenzar con los conceptos básicos sobre preguntas de matrices, listas enlazadas, pilas y árboles y luego preguntas de gráficos, programación dinámica. Una vez que sea minucioso con estos conceptos, puede intentar resolver problemas avanzados.

        Siento que los videos son una buena manera de entender estos problemas, ya que solo lleva unos minutos y recordamos mejor los conceptos cuando realmente los vemos y podemos visualizarlos.

        Encontré este canal: IDeserve que tiene buenos problemas de programación. Los videos tienen una duración de 4 a 10 minutos en los que se explica el algoritmo con la ayuda de ejemplos y animaciones. Además, también se proporcionan soluciones.

        Una vez que tenemos claro el algoritmo, la codificación se vuelve muy fácil.

        Aquí está el enlace al sitio web: IDeserve: plataforma de aprendizaje única para mejorar las habilidades algorítmicas. La visualización del código que se proporciona aquí es una característica muy interesante.

        Aquí están las listas de reproducción sobre los temas mencionados anteriormente. Puede ver los videos en este orden:

        Matrices:

        Listas vinculadas:

        Arboles:

        Grafico:

        Programación dinámica:

        También puede consultar estos algoritmos aquí:

        Matrices

        Lista enlazada

        Arboles

        Instrumentos de cuerda

        Grafico

        Programación dinámica

        Otros buenos recursos que encontré útiles:

        Juez en línea de LeetCode

        Espero que esto ayude.

        Conceptos importantes en estructuras de datos y algoritmos

        1. Lista vinculada: individual y doblemente
        2. Apilar
        3. Colas
        4. Árboles de búsqueda binaria o árbol binario general
        5. Muchísimo
        6. Recorrido de gráfico básico y ruta más corta
        7. Hashing

        Creo que los cursos en línea te dan una mejor comprensión de los conceptos … así que aprende de los cursos en línea.

        Te sugiero algunos de los mejores cursos en línea.

        MEJORES ALGORITMOS Y ESTRUCTURAS DE DATOS CURSOS EN LÍNEA ..

        • Aprendizaje de estructuras de datos y algoritmos
        • Estructuras de datos prácticas y algoritmos en Java + HW
        • Algoritmos y estructuras de datos en Python

        elige el primer plato ..

        de este curso, puedes aprender sobre:

        En este curso de capacitación sobre estructuras de datos de aprendizaje y algoritmos, el autor experto Rod Stephens le enseñará cómo analizar e implementar algoritmos comunes utilizados. Este curso está diseñado para principiantes absolutos, lo que significa que no se requiere experiencia previa en programación.

        Comenzará aprendiendo sobre la teoría de la complejidad, luego comenzará a aprender sobre algoritmos numéricos, que incluyen matrices aleatorias, factorización prima e integración numérica. A partir de ahí, Rod le enseñará sobre listas enlazadas, como listas enlazadas individualmente, ordenadas y listas doblemente enlazadas. Este video tutorial también cubre matrices, pilas y colas, y ordenación. También aprenderá sobre la búsqueda, tablas hash, recursión y algoritmos de retroceso. Finalmente, cubrirá árboles, árboles balanceados, árboles de decisión y algoritmos de red.

        y..

        • Aprenda a analizar e implementar algoritmos comunes
        • Aprenda sobre los diferentes tipos de estructuras de datos
        • Teoría de la complejidad

        TODO LO MEJOR…

        webs: –
        Página en geeksforgeeks.org
        Tutoriales de ciencia de datos

        libros:-
        1. CLRS : el clásico libro de texto completo sobre algoritmos. Una lectura obligada al menos una vez en la carrera del programador.

        2. Introducción a los algoritmos: un enfoque creativo de Udi Manber : un excelente libro sobre diversas categorías de algoritmos. Muchas preguntas interesantes en los portales web como preguntas de entrevista se pueden encontrar en este libro. Los ejercicios de fin de capítulo son un activo. Uno debe intentar la sección “Problemas creativos” al final de cada capítulo. Si un programador quiere conocer el poder de la inducción como un enfoque de resolución de problemas, debe leer este libro. Muy recomendable

        3. El manual de diseño de algoritmos de Skiena : muchos problemas algorítmicos y debates, historias de guerra, problemas relacionados, ejercicios interesantes. Ayuda a modelar un problema de diferentes maneras. Un libro de trabajo imprescindible para todo programador apasionado. No lea esto a menos que tenga una buena comprensión de los algoritmos.

        4. Introducción al diseño y análisis de algoritmos por Levitin – Un libro introductorio en diseño de algoritmos. Recomendado para principiantes. Uno puede disfrutar de la explicación y resolver los ejercicios de fin de sección.

        Sobre el estilo de programación:
        1. Programming Pearls por Bentley – Un libro de lectura obligatoria sobre diseño e implementación de programas de computadora.

        2. La práctica de la programación por Kernighan : escrita durante los días de Unix, sigue siendo uno de los mejores recursos en diseño de programas y principios de implementación.

        3. Programación avanzada en el entorno Unix por W. Richard Stevens – Cubre muchos internos de Unix y API a nivel de núcleo. Sigue un excelente estilo de programación. Los libros de Stevens son uno de los mejores en su categoría. Yo diría que se encuentran en el nivel de CLRS en la categoría de algoritmos. Muy recomendable

        Hagamos un poco de matemática.
        Para convertirse en un verdadero experto, debe dedicar unas 10000 horas de trabajo. Pero el año contiene 365 * 24 = 8760 horas, y a veces necesitas dormir.
        Pero no se enoje, porque puede conformarse con la siguiente mejor opción: puede dejar de convertirse en un experto para 2017-2018, pero ser realmente bueno este año.

        Aquí hay una breve lista de temas que debe cubrir en matemáticas: la respuesta de Roman Trusov a ¿Qué habilidades matemáticas son necesarias para convertirse en un buen programador?

        Todo lo que necesita es CLRS, libros de matemáticas (puede encontrar muy buenas listas de libros de texto aquí en Quora) y practicar.

        No necesitas una rutina estricta como algún tipo de deportista profesional, porque la programación es mortalmente aburrida sin diversión, necesitas persistencia en tu práctica. Escriba toneladas de código todos los días, la única condición es que el código debe ser nuevo para usted. Si su objetivo principal es sobresalir en algoritmos, concéntrese en la programación competitiva:

        • TopCoder
        • Codeforces
        • SPOJ
        • CodeChef
        • HackerRank

        No sé la cantidad de tiempo que puede dedicar a la codificación todos los días, pero sugeriría que 500 problemas en un año serán el mínimo necesario para estar listos para avanzar.