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

Este es un recurso accesible sobre estructuras de datos, con implementaciones de muestra y grandes 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 de datos / técnicas 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 enlazadas
Programación Dinámica / Memorización
Tablas de hash
Árboles AVL
Arboles extendidos
Árboles binarios de búsqueda
Muchísimo
Arboles aumentados
Gráficos / Búsqueda en profundidad / Búsqueda en anchura
Algoritmos aleatorios / estructuras de datos (listas de saltos)
Varios algoritmos de clasificación (ordenación rápida, ordenación de radixes, ordenamiento por fusión, ordenación de pila, etc.).
Recursion

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 tienes que tener mucho cuidado con la administración de memoria. En general, también es un lenguaje que todo científico informático debe conocer.

Asegúrese de hacer realmente los conjuntos de problemas! La implementación de estructuras de datos es la forma en que mejorará en la comprensión de sus usos. Es importante poder elegir las estructuras de datos adecuadas para un problema determinado y diseñar las suyas mediante la combinación de elementos de otras estructuras de datos.

Para que quede claro, este no es un curso de algoritmos, ya que se centra principalmente en las estructuras de datos. El departamento ofrece 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 de la mayoría de los algoritmos / operaciones relacionadas con las estructuras de datos. en el curso. Además, no se deje intimidar por la longitud! Si sabe C, la parte de las notas sobre Estructuras de datos tiene solo 180 páginas LaTeX dispersas, con ejemplos de código también. Una gran parte es la revisión del lenguaje C. ¡Buena suerte!

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

Como siempre, la práctica hace perfecto. Cuanto más aprendes los algoritmos, visualízalos e intenta implementarlos en situaciones de la vida real, más buceas en el mundo de los algoritmos. Comienza a desarrollar el pensamiento algorítmico visualizando algoritmos.
Esto es lo que recomendaré IDeserve.
Es una plataforma genial donde puedes visualizar los algoritmos y las estructuras de datos dentro de ella.
Creo que es la mayor fuente de algoritmos que se pueden visualizar. Es genial ver los algoritmos que se ejecutan y animan sobre la marcha.
Practica cada vez más y comenzarás a visualizar problemas más rápido.
Una vez más, no hace falta hacer más hincapié en esto, la 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 – Clasificación por selección (Algoritmo de clasificación – Clasificación por selección)
Algoritmo de clasificación – Clasificación por inserción (Algoritmo de clasificación – Clasificación por inserción)
Algoritmo de ordenación – Ordenación de pila (Algoritmo de ordenación – Ordenación de pila)
Algoritmo de clasificación – Combinación de clasificación (Algoritmo de clasificación – Clasificación de fusión)
Clasificación de panqueques (Clasificación de panqueques)
Cuente las frecuencias de los elementos de la matriz en el rango 1 a n (cuente las frecuencias de los elementos de la matriz en el rango 1 a n)
Buscar todas las permutaciones de una cadena (Buscar 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)
Buscar un elemento de pico en una matriz (encontrar un elemento de pico en una matriz)
Buscar pivote en una matriz rotada clasificada (Buscar pivote en una matriz rotada ordenada)
Encuentre un elemento en una matriz rotada ordenada (Encuentre un elemento en una matriz rotada ordenada)
Encuentre el elemento en la matriz rotada clasificada sin encontrar el pivote (encuentre el elemento en la matriz rotada clasificada sin encontrar el pivote)
Encuentre duplicados en una matriz de enteros (Encuentre duplicados en una matriz de enteros)
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)
Girar una matriz (Girar una matriz)
Buscar elemento mayoritario en una matriz (Buscar elemento mayoritario en una matriz)
Encontrar la mediana de dos matrices ordenadas (Encontrar la mediana de dos matrices ordenadas)
Primer carácter no repetitivo en una cadena (Primer carácter no repetitivo en una cadena)
Reorganizar los elementos en una matriz para poner los elementos positivos y negativos en orden alterno (Reorganizar los elementos en una matriz para poner los elementos positivos y negativos en orden alterno)
Encuentre el siguiente número mayor usando los mismos dígitos (Encuentre el siguiente número mayor usando los mismos dígitos)
La subcadena más larga con caracteres no repetitivos (la subcadena más larga con caracteres no repetitivos)
Dada una matriz con todos los elementos distintos, encuentre la longitud de la sub-matriz más larga que tiene elementos (no en ningún orden en particular) que podrían formar una secuencia contigua (dada una matriz con todos los elementos distintos, encuentre la longitud de la subunidad más larga) matriz que tiene elementos (no en ningún orden en particular) que podrían formar una secuencia contigua)
Encuentre la ruta de costo mínimo en una matriz (Encuentre la ruta de costo mínimo en una matriz)
Encuentre la longitud de la subsecuencia en aumento más larga en una matriz (Encuentre la longitud de la subsecuencia en aumento más larga en una matriz)
Encuentre la subsecuencia en aumento más larga en una matriz O (n logn) (Subsecuencia en aumento 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)
Encuentre el número total de formas de hacer cambios usando un conjunto de monedas dado (Encuentre el número total de formas de hacer cambios usando un conjunto de monedas dado)
Número mínimo de monedas para hacer cambio (Número mínimo de monedas para hacer cambio)
Contar todas las decodificaciones posibles de una secuencia de dígitos dada – (Contar todas las decodificaciones posibles de una secuencia de dígitos dada)
Encuentre la subsecuencia creciente de longitud tres con producto máximo (Encuentre la subsecuencia creciente de longitud tres con producto máximo)
Encuentra sub-secuencia creciente de longitud tres con producto máximo | Enfoque optimizado (Encuentre la subsecuencia creciente de longitud tres con 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 de enteros correspondiente a la cadena que especifica las transiciones de aumento-disminución (Encuentre una matriz de enteros correspondiente a la cadena que especifica las transiciones de aumento-disminución)
Dada una matriz con todos los elementos distintos, encuentre la longitud de la sub-matriz más larga que tiene elementos (no en ningún orden en particular) que podrían formar una secuencia contigua (dada una matriz con todos los elementos distintos, encuentre la longitud de la subunidad más larga) matriz que tiene elementos (no en ningún orden en particular) que podrían formar una secuencia contigua)
Combine dos matrices ordenadas sin usar espacio adicional (Combine dos matrices ordenadas sin usar espacio extra)
0-1 Problema de mochila (0-1 Problema de mochila)
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)
Distribuir problema de chocolates (Distribuir problema de chocolates)
Atrapando el agua de lluvia entre las torres (Atrapando el agua de lluvia entre las torres)
Encuentre la sub-matriz de longitud mínima con la suma K (Encuentre la sub-matriz de longitud mínima con la suma K)

Visualización de algoritmos en árboles.
Comprueba si un árbol binario es un árbol de búsqueda binario (Comprueba si un árbol binario es un árbol de búsqueda binario)
Comprueba si dos nodos son primos en un árbol binario (Comprueba si dos nodos son primos en un árbol binario)
Eliminar todos los nodos que se encuentran en la ruta con una suma menor que k (Eliminar todos los nodos que se encuentran en la ruta con una suma menor que k)
Árbol binario de búsqueda | Inserción y búsqueda (Árbol de búsqueda binario | Inserción y búsqueda)
Árbol binario de búsqueda | Eliminación (Árbol de búsqueda binario | Eliminación)
Nivel de árbol binario Orden de recorrido (Orden de nivel de árbol binario de recorrido)
Imprimir la vista inferior de un árbol binario (Imprimir la vista inferior de un árbol binario)
Imprima la vista inferior de un árbol binario utilizando el orden de nivel (Imprima la vista inferior de un árbol binario utilizando el 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) (Marque 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) (Marque si un árbol binario es un subárbol de otro árbol binario en el tiempo O (n))
Verifique si todos los nodos internos de BST tienen solo un hijo sin árbol de construcción (Verifique si todos los nodos internos de BST tienen solo un hijo sin árbol de construcción)
Comprueba si un árbol binario dado es un árbol simétrico o no (Comprueba si un árbol binario dado es un árbol 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-ario dado es un árbol simétrico o no (verifique si el árbol n-ario dado es un árbol simétrico o no)
Comprueba si dos árboles binarios son idénticos (Comprueba si dos árboles binarios son idénticos)
Convertir un árbol binario en una lista doblemente enlazada (Convertir un árbol binario en una lista doblemente enlazada)
Convertir una lista ordenada de enlace doble en un árbol de búsqueda binaria equilibrada (Convertir una lista ordenada de enlace doble en un árbol de búsqueda binaria equilibrada)
Crear un árbol de búsqueda binario equilibrado desde una matriz ordenada (Crear un árbol de búsqueda binario equilibrado desde 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 inorder y postorder (Construir árbol binario a partir de recorridos inorder y postorder)
Construir árbol binario a partir de recorridos inorder y preorder (Construir árbol binario a partir de recorridos inorder y preorder)
Construya el árbol binario a partir de su representación de matriz primaria (Construya el árbol binario a partir de su representación de matriz matriz)
Á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 binario (Convertir árbol binario en árbol de búsqueda binario)
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 a partir de su representación de matriz principal (Encuentre la altura del árbol binario a partir de su representación de matriz primaria)
Encontrar la suma de todas las hojas de la izquierda de un árbol binario (Buscar la suma de todas las hojas de la izquierda de un árbol binario)
Encontrar el piso y el techo de un elemento a partir de un conjunto de datos determinado utilizando el árbol de búsqueda binario
Recupere un árbol de búsqueda binario si se intercambian las posiciones de dos nodos. (Recupere un árbol de búsqueda binario 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)
El antepasado común más bajo de 2 nodos en un árbol binario (el antepasado 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 a su árbol espejo (Convertir un árbol binario a su árbol espejo)
Convertir el árbol n-ario dado a su imagen reflejada (Convertir el árbol n-ario dado a su imagen reflejada)
Estructura de datos Trie | Insertar y buscar (Estructura de datos Trie | Insertar y buscar)
Estructura de datos Trie | Eliminar (Estructura de datos Trie | Eliminar)
Coincidencia de patrones usando Trie (Coincidencia de patrones usando Trie)
Coincidencia de prefijos más larga usando Trie (Coincidencia de prefijos más larga usando Trie)
Recorrido posterior a un pedido de un árbol binario (Recorrido posterior a un pedido de un árbol binario)
Pre-order Traversal of a Binary Tree (Pre-order Traversal of a Binary Tree)
Imprimir todas las rutas de la raíz a la hoja de un árbol binario (imprimir todas las rutas de la raíz a la 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 la vista derecha de un árbol binario (Imprimir la vista derecha de un árbol binario)
Serializar y Deserializar un árbol de búsqueda binario utilizando el recorrido de orden posterior (Serializar y Deserializar un árbol de búsqueda binario utilizando el recorrido de orden posterior)
Serializar y deserializar un árbol de búsqueda binario (Serializar y deserializar un árbol de búsqueda binario)
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 orden de nivel (Imprima la vista superior de un árbol binario usando el orden de nivel)
Imprimir vista superior de un árbol binario (Imprimir vista superior de un árbol binario)
Número total de árboles de búsqueda binarios posibles con n teclas (Número total de árboles de búsqueda binarios posibles con n teclas)
Dada una secuencia de palabras, agrupa todos los anagramas e imprímelos. (Dada una secuencia de palabras, agrupe todos los anagramas e imprímalos.)

Visualización de algoritmos sobre cuerdas.
Word Break Problem (Word Break Problem)
Invertir palabras en una cadena (Invertir palabras en una cadena)
Buscar todas las permutaciones de una cadena (Buscar todas las permutaciones de una cadena)
Encuentre la distancia de edición mínima entre dos cadenas dadas (Encuentre la distancia de edición mínima entre dos cadenas dadas)
Para imprimir el número máximo de Como usando cuatro claves dadas. (Para imprimir el número máximo de As usando cuatro claves dadas.)
Comprobar paréntesis equilibrados en una cadena (Comprobar paréntesis equilibrados en una cadena)
Cadenas binarias distintas de longitud n sin 1s consecutivos (cadenas binarias distintas de longitud n sin 1s consecutivos)
Encontrar secuencias de ADN repetidas de 10 letras. (Encontrando 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 determinada serie de cadenas | Conjunto 1 (Agrupe todos los anagramas juntos de un conjunto dado de cadenas | Conjunto 1)
La subsecuencia común más larga (la subsecuencia común más larga)
Substring común más largo (Substring común más largo)
Secuencia palindrómica más larga (Secuencia palindrómica más larga)
Substring palindromic más largo (Substring palindromic más largo)
La subcadena más larga con caracteres no repetitivos (la subcadena más larga con caracteres no repetitivos)
Palindrome Min Cut (Palindrome Min Cut)
Palíndromo más corto (Palíndromo más corto)
El cálculo 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 de Knuth Morris Pratt para la comparación de patrones. (El algoritmo de Knuth Morris Pratt para la comparación de patrones).

Visualización de algoritmos en listas enlazadas
Invertir una lista enlazada: iterativa (Revertir una lista enlazada: iterativa)
Invertir una lista vinculada – Recursiva (Revertir una lista vinculada – Recursiva)
Combinar dos listas vinculadas ordenadas (Combinar 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 Vinculadas: O (m + n) Complejidad de Tiempo y O (1) Complejidad Espacial (Encuentre la intersección de dos Listas Vinculadas – O (m + n) Complejidad de Tiempo y O (1) Complejidad de Espacio)
Detecta un bucle en una lista enlazada y encuentra el nodo donde comienza el bucle. (Detecte un bucle en una lista enlazada y encuentre el nodo donde comienza el bucle).
Convertir un árbol binario en una lista doblemente enlazada (Convertir un árbol binario en una lista doblemente enlazada)
Convertir una lista ordenada de enlace doble en un árbol de búsqueda binaria equilibrada (Convertir una lista ordenada de enlace doble en un árbol de búsqueda binaria equilibrada)
Implementación de caché LRU (Implementación de caché LRU)

Visualización de algoritmos en grafos.
Algoritmo de Bellman-Ford (Algoritmo de Bellman-Ford)
El algoritmo de ruta más corta de Dijkstra (el 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 una gráfica acíclica dirigida. (Clasificación topológica de un gráfico acíclico dirigido.)

Visualización para Algoritmos de Programación Dinámica.
Word Break Problem (Word Break Problem)
Encuentre la ruta de costo mínimo en una matriz (Encuentre la ruta de costo mínimo en una matriz)
Suma máxima de subarreglos (Suma máxima de subarreglos)
Encuentre el número total de formas de hacer cambios usando un conjunto de monedas dado (Encuentre el número total de formas de hacer cambios usando un conjunto de monedas dado)
Número mínimo de monedas para hacer cambio (Número mínimo de monedas para hacer cambio)
Encuentre la longitud de la subsecuencia en aumento más larga en una matriz (Encuentre la longitud de la subsecuencia en aumento 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)
Contar todas las decodificaciones posibles de una secuencia de dígitos dada (contar todas las decodificaciones posibles de una secuencia de dígitos dada)
Para imprimir el número máximo de Como usando cuatro claves dadas. (Para imprimir el número máximo de As usando cuatro claves dadas.)
Encuentre la distancia de edición mínima entre dos cadenas dadas (Encuentre la distancia de edición mínima entre dos cadenas dadas)
Número total de árboles de búsqueda binarios posibles con n teclas (Número total de árboles de búsqueda binarios posibles con n teclas)
0-1 Problema de mochila (0-1 Problema de mochila)
La subsecuencia común más larga (la subsecuencia común más larga)
Substring común más largo (Substring común más largo)
Secuencia creciente más larga O (n logn) (Secuencia creciente más larga O (n logn))
Secuencia palindrómica más larga (Secuencia palindrómica más larga)
Substring palindromic más largo (Substring palindromic más largo)
Número de Fibonacci (Número de Fibonacci)
Palindrome Min Cut (Palindrome Min Cut)
Palíndromo más corto (Palíndromo más corto)
Subconjunto de problema de suma (Subconjunto de problema de suma)
Problema de la mina de oro (Problema de la mina de oro)

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

En el texto siguiente, los algoritmos y la estructura de datos que están 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.

¿Qué estudiar?

Paso 0:

  • Comprender sobre punteros en C ++, estructuras o clases.
  • Aprenda cómo calcular el peor de los casos, el mejor de los casos, el tiempo promedio de complejidad del caso

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
  • Selección de selección
  • Aprende los algoritmos de búsqueda junto con la complejidad del tiempo.
    • Busqueda lineal
    • Búsqueda binaria

    Paso 2 :

    • Apilar
    • Cola
    • Lista enlazada única (Insertar en la parte frontal, posterior, central; Eliminar en la parte frontal posterior central)
    • Lista de doble enlace
    • Lista enlazada circular

    Paso 3 :

    • Aprende los siguientes enfoques en algoritmos.
    • Dividir y conquistar (la clasificación por fusión , la clasificación rápida , la búsqueda binaria son algunos ejemplos)
    • Método codicioso ( Knapsack , algoritmo de Prim, algoritmo de Kruskal, Dijkstra, Bellmanford )
    • Programación dinámica ( 0/1 Mochila, Problema de vendedor ambulante , Cambio de moneda )
  • Retroceso ( problema de N Queens )
  • Etapa 4 :

    • Árbol binario
    • Árbol de búsqueda binaria
    • Altura de un árbol
    • Travesía de árboles
    • BFS
    • DFS
  • Buscando un elemento
  • Árbol AVL
  • Hash
  • ¿De dónde estudiar?

    GeeksforGeeks | Un portal informático para geeks.

    Estructuras de datos y algoritmos | Coursera

    Video conferencias | Introducción a los algoritmos (SMA 5503) | Ingeniería Eléctrica y Ciencias de la Computación | MIT OpenCourseWare

    Nota: Si necesita una respuesta detallada o un enfoque específico, no dude en enviarme un mensaje a 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 todos los mensajes se considera una biblia de este campo. Sin embargo, creo que si usted es un principiante en este campo con una experiencia de programación moderada y un promedio de antecedentes matemáticos, este libro podría tener una curva de aprendizaje muy pronunciada que debería evitar en este momento. No estoy diciendo que la curva de aprendizaje empinada sea mala, pero como principiante, debe centrarse en garantizar una comprensión intuitiva de los algoritmos junto con el conocimiento de implementar esos algoritmos en el idioma que elija. 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” resultará ser una guía y una referencia inestimable. Una vez que estudies este libro por completo, deberías poder comprender la mayoría de los editoriales de concursos algorítmicos de concordancia: resolver uno solo necesitaría más que el conocimiento de los algoritmos, se necesita práctica. Pero ese es un tema para otra discusión.

    De todos modos, CLRS asume una buena cantidad de antecedentes por parte del lector. Si tiene un instructor excepcional que se encarga de la parte de intuición e implementación, entonces, por todos los medios, vaya a este libro. Pero si no tiene tanta suerte, le sugeriría que comience por leer Cómo resolverlo por computadora. Este es un libro escrito para gente como tú y yo que queremos entrar en este hermoso campo pero que 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 de todo el pensamiento “orientado al lenguaje” que hace que sea difícil pensar en problemas complejos porque está demasiado concentrado. En el lenguaje de programación que se olvida de mirar el problema.

    Sin embargo, si no eres muy fuerte en programación y necesitas un libro que enseñe algoritmos implementándolos en un lenguaje de programación, te recomendaría seriamente Estructuras de datos y algoritmos de Sams en 24 horas: Robert Lafore: 978067231633g3: Amazon.com: Libros . Es un libro muy bien escrito con una explicación muy lúcida. Habiéndolo leído yo mismo, puedo responder por la efectividad de este libro. No intentes terminar este libro en 24 horas. Tómate tu tiempo para leerlo. Léelo a fondo. No lo llevará muy lejos, pero hará que sus conceptos básicos en DS / Algo y C ++ sean muy sólidos. Si lees este libro, no creo que necesites el libro que mencioné anteriormente. Después de leer este libro, vaya para CLRS. Tendrás el gusto de tu vida. Si eres una persona de Java, entonces estás estudiando 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 (3ª 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 te 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 (3ª 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.

    Me gustaría tener un enfoque de dos puntas. Trabaja con las cosas de nivel superior que hacen que todo sea fácil y te permite sumergirte en algoritmos de nivel superior y otras cosas rápidamente. Pero también trabajar en el meollo del grano.

    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, busque en 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 en bruto; configure algo como PyDev para eclipse para las funciones de depuración y autocompletar, y solo para obtener más experiencia trabajando con software. Instalar y configurar el software es una parte importante de ser un programador eficaz. 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”; búsquelo en Google).

    Sin embargo, estos son solo pequeños pasos, aún no has aprendido cómo programar de manera efectiva, acabas de aprender algunas de las tuercas y tornillos.

    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, falta mucho en el sitio web, pero lo importante es que le guía a través del uso de Linux, un entorno muy importante para entender y poder usar de manera eficiente, le da una mucha programación de C para hacer, “cerca del metal”, es decir, con mucha abstracción expuesta a ti. También te presenta cosas como Sockets y construye cada aplicación sobre la otra. Harías cosas como juzgar cuando para poner sus propias funciones en bibliotecas, y también aprender a usar bibliotecas integradas de manera efectiva (es bueno conocer las estructuras de datos, pero en la práctica casi nunca las implementará usted mismo; en su mayoría, debe comprender su comportamiento para usar las bibliotecas existentes o ampliarlas). ellos un poco).

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

    Sin embargo, si estás en un entorno universitario, tienes mucho tiempo para aprender un buen número de cosas. Tome clases, trabaje duro, programe proyectos y no solo asignaciones, construya cosas, contribuya a proyectos de código abierto.

    Buena suerte.

    Actualizado el 17 de agosto :

    Ayer, alcancé 99 percentiles en algoritmos en Hackerrank en menos de 1 año, con cierto trabajo de encendido / apagado durante varios meses, en realidad, la cantidad de días para obtener esto es de 106 días, es decir, aproximadamente 3 meses.

    Si tuviera que rehacer mi último año de trabajo, haría algunos como éste:

    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 : Me gustaría comprar y usar una pizarra blanca (tamaño 2X3 pies) con un plumero ( menos de 1200 rupias) al comienzo, 2 marcadores azules de pizarra blanca para escribir , tinta de recarga de marcador de pizarra blanca – 10 caja (aproximadamente 300) rupias, una general, no la recarga del marcador permanente) para rellenar los marcadores según sea necesario.
    1. Esto fue crucial, porque los problemas difíciles requerían muchas muestras de gran tamaño, en el papel es factible pero es difícil, la pizarra blanca es perfecta, frote la parte del tablero y vuelva a dibujar. Esto fue especialmente útil para problemas de programación dinámica como LCS, LIS y sus variantes, que requieren tablas grandes. Resolví problemas difíciles en DP solo porque tenía una pizarra blanca, sin una pizarra blanca que no podía resolver, y al principio era una pesadilla.
    2. Esto también es crucial para la teoría de juegos, que estoy haciendo estos días, 18 de agosto de 2016.
  • Estructuras de datos ante algoritmos.
    1. Habría aprendido estructuras de datos, antes de hacer algoritmos.
  • Un plan
    1. Si hubiera algo como abajo, leería por lo 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 2 meses de descanso y aprendería todo lo que hay en el siguiente enlace: ManoharPoreddy / HackerRank-Topics
  • Un plan completo de extremo a extremo como el que se muestra a continuación, hubiera sido muy útil:
    1. Recursos todo en uno de CS y CP por Manohar Reddy Poreddy en AlgorithmsAndMore
  • Trabajo duro continuo
    1. Finalmente hice mucho trabajo on / off que se puede ver aquí.
    1. Debajo de las presentaciones, se puede ver lleno de noviembre, febrero, marzo, abril y hasta finales de mayo y la mitad de julio, no he trabajado en algoritmos.
    2. Este tipo de trabajo on-off es un error, tenemos que hacer un trabajo continuo para mantenernos por delante de la competencia, cada vez que tomé un descanso, mi rango retrocedió unos pocos cientos, por lo que solo pude borrar ese retraso cuando volví a trabajar en algoritmos En última instancia, 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 más y más refinadas y mejores formas de aprender DS y A, escribiré una mejor una vez que llegue al Top 100, 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 Java

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

    Para problemas complejos, divida en sub problemas más pequeños, escriba 1 código de línea que resuelva 1 subproblema, por ejemplo, use 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 a 1 vistazo.

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

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

    Cuanto más aprendas, mejor y más rápido puedes llegar al Top 100, es decir, los temas te ayudan a escribir mejor código, ya que brinda ideas únicas y diferentes para hacer el mismo problema, pero posiblemente con métodos más rápidos que ingenuos.

    2 horas: A medida que aprendas cada uno de los temas anteriores, aplícalos.

    Encuentre una pregunta en un sitio web competitivo y resuélvalo, o pregunte a otros por preguntas similares donde pueda aplicar el tema.

    esto determinará su comprensión sobre el tema, eliminará todas las suposiciones incorrectas que hizo mientras aprendía y lo recordará durante mucho tiempo

    cada vez que resuelvas 3 preguntas, tu rango saltará 1000+ o más rangos inicialmente hasta que alcances 10K, luego 100+ rangos más o menos, de esta manera aprendes mejor y progresas rápidamente hacia los Top 100.

    Algunos buenos libros (que nunca leí), vea la sección “Libros” en Recursos de CS y PC Todo en uno por Manohar Reddy Poreddy en AlgorithmsAndMore

    la mejor de las suertes

    Si tienes alguna duda en lo de arriba, hazme un ping.

    Estructuras de datos y algoritmos (DSA para abreviar) es un curso basado en la implementación. Muchas empresas hacen mucho 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ías comenzar a leer Introducción a los algoritmos de Cormen et. todos. Se dice que este libro es el mejor para DSA, pero puede resultar un poco difícil leerlo mientras se trabaja con su carga de cursos. En su lugar, puede usar esto como un libro de referencia que complementa su libro de cursos recomendado.
    2. Implementar las estructuras de datos que lees. Si bien leer sobre ellos puede darle una idea clara de cómo funcionan, es diferente de la implementación real, en la que tendrá que ocuparse de los casos de límites. Habrá casos en los que olvide los cheques nulos y arruine todo su código.
    3. Comprender la complejidad. Debe poder calcular la complejidad de espacio de varias estructuras de datos, la complejidad de tiempo de sus operaciones y la complejidad de tiempo y espacio 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 le ayudará a elegir la estructura de datos óptima o algo para un problema particular. Incluso puede buscar problemas específicos de la estructura de datos o algo que desee, pero ¿dónde está la diversión?

    Además, también puede ver las conferencias de video de MIT en OCW o 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.

    Al ser 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 (largo plazo):

    1. Lo primero es que, comience a leer sus libros para c ++ o Java y practique la codificación de Array, Class (para Nodo, etc.), Colección (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 desarrollar su pensamiento para preguntas lógicas en varios DS como Array, Tree, Trie From Books como Kurumanchi / cracking codificación de entrevistas, etc.
    4. Vaya a HackerRank / Earth, CodeChef, geeksforgeeks y comience a practicar las preguntas y respuestas de los mismos temas.

    Tutoría (corto plazo):

    1. Encuentre Good Mentor o una institución de coaching en línea o con base en Faceface como en Tutorialspoint o GoHired (mi sitio), o Learnbay, etc.
    2. Empieza a aprender la lógica desde allí. En su mayoría, estos mentores explican cada tema desde cero, discuten varios problemas con usted y le brindan el “Modo de pensar” para tales preguntas de DSA, incluso si surgen nuevas preguntas, puede manejar tales preguntas en una entrevista (esta es mi forma de enseñar).
    3. Solicite a los Consultores una carta de llamada para Amazon, Microsoft, etc.
      (El mentor también puede ayudarlo en eso, al menos lo hago con mis alumnos)

    PD: seguí el primer acercamiento, y después de 6 a 8 meses, podría abarcar todos los temas de DSA en mis propios años atrás, como cuando lo hace por su cuenta, necesita demasiada motivación y empuje, lo cual no obtendremos. por tanto tiempo

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

    Libros:

    Introducción al algoritmo
    Comúnmente conocido como CLRS, toma la primera letra de cada uno de los co-escritores del libro. Uno de los libros de algoritmos más completos que existen. Tiene más de 1000 páginas de contenido, cubriendo 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 centrado en la enseñanza de los elementos esenciales en otros lugares 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 enorme catálogo de algoritmos, que sirve como una gran referencia para resolver problemas algorítmicos. Libro cubre conceptos algorítmicos clave. Parte de la implementación del algoritmo se da en código C. Comparado 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 introductoria de algoritmo de nivel para estudiantes de pregrado 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 conocer el concepto de estructuras de datos más avanzadas.

    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 documentos académicos que traten el tema.

    Al ser 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 (largo plazo):

    1. Lo primero es que, comience a leer sus libros para c ++ o Java y practique la codificación de Array, Class (para Nodo, etc.), Colección (STL Library en c ++), etc.
    2. Comprenda 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 desarrollar su pensamiento para preguntas lógicas en varios DS como Array, Tree, Trie From Books como Kurumanchi / cracking codificación de entrevistas, etc.
    4. Vaya a HackerRank / Earth, CodeChef, geeksforgeeks y comience a practicar las preguntas y respuestas de los mismos temas.

    Tutoría (corto plazo):

    1. Encuentre a Good Mentor o a una institución de coaching en línea o en forma de cara a cara, como en Tutorialspoint o GoHired (mi sitio), o Learnbay, etc.
    2. Empieza a aprender la lógica desde allí. En su mayoría, estos mentores explican cada tema desde cero, discuten varios problemas con usted y le brindan el “Modo de pensar” para tales preguntas de DSA, incluso si surgen nuevas preguntas, puede manejar tales preguntas en una entrevista (esta es mi forma de enseñar).
    3. Solicite a los Consultores una carta de llamada para Amazon, Microsoft, etc.
      (El mentor también puede ayudarlo en eso, al menos lo hago con mis alumnos)

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

    1.5 meses en programación competitiva? Bonito. Creo que habías estado resolviendo algunos problemas simples de matemática y ad hoc, que no requieren más que un poco de sentido común y algunas habilidades de implementación. Si ese es el caso entonces felicitaciones. Has dado el primer paso.

    Asumo lo siguiente.

    1. Todavía estás 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 la práctica. No sólo aprendas teoría.

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

    1. Como base tienes que aprender matemáticas discretas. No solo es 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, sabiendo que esto es un deber. El espacio y las complejidades del tiempo – esto es lo que importa mucho.
    3. Aprender el funcionamiento de estructuras de datos básicas. 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 necesite modificarlos un poco para algunos problemas avanzados. También la implementación de árboles de búsqueda binaria equilibrada como árboles rojo-negros no es práctica durante los concursos. Proporcionaré los enlaces a los recursos para aprender sobre estas cosas al final.

      Al principio, trate de obtener una intuición 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 entender las pruebas, pero lo entiende de manera intuitiva, 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 proporciona semántica LIFO y FIFO respectivamente – pila y cola en C ++. Puedes 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. Set – 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 utilizando árboles de búsqueda binaria equilibrada y el otro se implementa utilizando un Hashtable.
    6. Mapa: java.util.TreeMap y java.util.HashMap en Java. map y unordered_map en C ++. Son contenedores asociativos.
  • Bien, ahora conoces las estructuras de datos básicas y también su implementación en bibliotecas estándar. También estudiar algunos algoritmos conocidos. Algoritmos como la clasificació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 binarias de búsqueda.

    No solo te 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 insectos. Podrían. Pero no te preocupes). Además, no reinventes la rueda.

  • Bien, ahora no solo conoce los algoritmos básicos y las 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. Encontrarás términos como Dividir y Conquistar (mientras estudias los algoritmos de combinación y ordenación rápida), Programación dinámica (¡¿algo espantoso. ¡Hu !?), Fuerza bruta, Retroceso recursivo, algoritmos codiciosos, etc.

    Estudiar 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 puede probarlo, entonces piénselo nuevamente. La intuición sale mal muchas veces aquí. Por eso necesitas estudiar las 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 los “paradigmas de diseño de algoritmos”. Tuve que mencionarlo porque otro día tuve una pregunta que me preguntaba por la complejidad del “algoritmo de programación dinámica”.

  • Ahora dirígete a los algoritmos de la teoría de grafos. Necesitas todos los conocimientos que aprendiste antes. Aprenda algunos algoritmos estándar como MST, la ruta más corta, DFS y BFS. Mantener los flujos para otro día.
  • Felicitaciones por llegar tan lejos. Espero que también estés 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. Participa en concursos y trata de resolver tantos problemas como sea posible.
    2. Después de los concursos, lee el editorial de problemas que no has resuelto.
    3. Si se trata de nuevos conceptos aprendelos. 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. Resuelva los problemas no resueltos después de la competencia (llamado sobresolución).
    5. Lea el código de otros en caso de que no haya obtenido la solución presentada en el editorial. Por lo general, se proporcionan los códigos de setter y tester. Pero recuerde que los programadores competitivos generalmente no escriben código limpio, lo que es un inconveniente.

    Aprender, aplicar, practicar, practicar y practicar. Por favor, no piense en ganar contra Gennady Korotkevich con pocos meses de práctica a menos que sea Chuck Norris o Rajnikanth 😛 (o alguien así).

    Para practicar, puede intentar resolver los primeros 200–300 problemas más resueltos en SPOJ. Los 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 lleva a cabo 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. Visualización de estructuras de datos y algoritmos a través de la animación: utilice 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 sí recomiendo simular a mano si es posible porque pensará 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 introductorio de algoritmos. Pero debes saber Java
    3. Algoritmos, Parte II – Universidad de Princeton | Coursera: este curso enseña algoritmos de grafos, tanto básicos como avanzados, Programación lineal, algoritmos simplex y algunos problemas difíciles, como encontrar si un gráfico es hamiltoniano. Completar tareas en estos dos cursos. Es divertido y lo vale totalmente.
    4. Algoritmos | Coursera – de la Universidad de Stanford. Esta es una especialización de 4 cursos. Los dos primeros cubren estructuras de datos y algoritmos básicos. Los dos últimos gráficos de portadas, NP-Dureza. A diferencia de los de Princeton, este curso no requiere que usted conozca Java. Pero debes saber al menos un lenguaje de programación.
    1. Divide y conquista, clasifica y busca, y algoritmos aleatorios – Universidad de Stanford | Coursera
    2. Búsqueda de gráficos, rutas más cortas y estructuras de datos – Stanford University | Coursera
    3. Algoritmos codiciosos, árboles de expansión mínimos y programación dinámica – Universidad de Stanford | Coursera
    4. Rutas más cortas revisadas, problemas NP-completos y qué hacer al respecto – Stanford University | Coursera
  • MIT OCW – Matemáticas para Ciencias de la Computación – Matemáticas discretas. Es necesario estudiar estructuras de datos y algoritmos.
  • MIT OCW – Introducción a los algoritmos (SMA 5503) – Esto sigue el currículo “Introducción a los algoritmos”. Comencé 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 lo he probado, pero fue sugerido por alguien 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 puedes conseguir este libro, entonces simplemente síguelo.
    4. Algorithms 4th edition – por Robert Sedgewick y Kevin Wayne.

    Algunos recursos específicamente 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. Increíble recurso para DS y algoritmos
    5. ¿Cuáles son los algoritmos “imprescindibles” para los concursos de programación en línea?

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

    1. Respuesta del usuario de Quora a ¿Cómo aprendo la programación competitiva como principiante?
    2. La respuesta del usuario de Quora a ¿Cómo empiezo a aprender o a fortalecer mi conocimiento sobre estructuras de datos y algoritmos?
    3. La 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. La respuesta del usuario de Quora a ¿Qué tipo de matemáticas tendré que aprender para convertirme en 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 permanecer 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 un aprendizaje obligatorio … C / Java / Python es la construcción y las estructuras de datos / algoritmos es la base …

    Para ponerlo matemáticamente, Estructuras de datos + Algoritmos = Programa

    Es hora de comenzar a aprender estructuras de datos y algoritmos … Entonces, veamos cómo abordar estructuras de datos y 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 pueda usarse de manera eficiente.

    Ejemplo: Arreglos, 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.

    ¿Qué temas necesita enfocar cuando aprende Estructuras de datos y algoritmos?

    Estructuras de datos:

    • Conceptos básicos de las estructuras de datos
    • Estructuras de datos lineales
      1. Arrays
      2. Listas enlazadas junto con listas circulares y de enlace doble
      3. Pilas con el análisis de expresión
      4. Colas con cola y colas circulares
      • Estructuras de datos no lineales
        1. Gráficos con DFS, BFS, Prims, Kruskals, Bellman Ford Algorithms
        2. Árboles con Traversal, árboles binarios de búsqueda, árboles B, árboles B +, árboles AVL, árboles extensores, árboles rojos negros y montón
        • Técnicas de clasificación: selección por selección, clasificación por burbuja, clasificación por inserción, clasificación rápida, clasificación por fusión, clasificación por montón, clasificación por concha, clasificación por cubo, clasificación por radios
        • Técnicas de búsqueda: Búsqueda lineal, Búsqueda binaria, Búsqueda por interpolación
        • Colisión con hash
        • Recursion

        Algoritmos:

        • Análisis asintótico
        • Teorema del maestro
        • Algoritmos codiciosos
        • Divide y vencerás los algoritmos
        • Algoritmos de ramas y encuadernaciones
        • Programación dinámica
        • NP Hard y NP problemas completos

        ¿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 estructuras de datos y algoritmos?

        • Lee un capitulo Entiendelo. Subraya las partes que no entiendes. Leelo de nuevo. Si aún tienes dudas, busca en la red, ve los videos de Neptel de YouTube o publica en quora para obtener respuestas de los profesionales.
        • Una vez que haya terminado, empiece a resolver los números que se dan al final del capítulo. Si estás atascado, vuelve a leer el concepto y prueba. Si aún no puedes resolver, pide ayuda a los 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 haya completado.
        • Una vez que tenga confianza con un capítulo, pase al siguiente. Pero, no te olvides de revisar el capítulo anterior después de 15 días. Verifica si todavía tienes la misma confianza en ese capítulo como lo estabas antes.

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

        Si aún tienes dudas, remite mi respuesta:

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

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

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

        Averigüe los prerrequisitos (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 el lenguaje C?

        ¡¡¡Disfruta aprendiendo!!!

        Gracias por la 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, la preparación para las colocaciones inmediatamente después del segundo año no es necesaria en absoluto. Recomendaría lo siguiente para ayudarlo a convertirse en un mejor programador en lugar de ayudarlo a realizar entrevistas.

        • Encuentra tu pasión:

        El desarrollo de aplicaciones y la programación competitiva son dos grandes flujos de programación.

        Puede probar ambos o elegir cualquiera según su interés.
        Por ejemplo, me interesé 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 profesores pueden publicar tareas, horarios y otras actualizaciones. ¡Aprender cosas haciéndolas es tan efectivo!

        Nota: el conocimiento del desarrollo de aplicaciones siempre te ayudará a terminar tus proyectos académicos. Si estás interesado, también puedes 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 Chrome para la 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 adelante, en mi segundo año, comencé a resolver problemas en Spoj y también lo encontré 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 programar! 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 eso es una tontería, y puedes ser un programador perfectamente bueno sin vivir y respirar tu trabajo. Pero aún debe hacer un esfuerzo concertado para adquirir experiencia y ser sólido con 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 adelante, intente hacer el mismo problema de DP (seguramente lo resolverá o, al menos, lo resolverá parcialmente). Por eso es importante tener una actitud positiva cuando practicas la programación.

        • Crear un panel de discusión:

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

        Tenga una sesión de “Cuestión del día” o actualícese constantemente con preguntas interesantes.

        • Trabajar en una startup:

        Pasante en un inicio si no tiene una pasantía en una empresa establecida. De acuerdo con lo que he escuchado de muchos de mis amigos y adultos mayores, las pasantías técnicas le brindan una excelente experiencia de programación y agregan valor a su currículum. Aprenderás sobre muchas herramientas y tecnologías de programación emocionantes.

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

        • Asistir a un MOOC:

        Coursera, Udacity y muchos sitios similares ofrecen MOOC ( cursos en línea masivos y abiertos) en muchos campos informáticos, 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 de la entrevista de prácticas:

        Si las empresas visitan tu universidad para reclutar pasantes, haz todo lo posible para obtener una oferta. Planee en consecuencia y comience a prepararse.
        La mayoría de las entrevistas de prácticas ponen a prueba tus conceptos básicos en codificación, algoritmo y estructura de datos. Intenta resolver las preguntas de la 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, le proporcionará un pasante seguro.

        Todo lo mejor. 🙂

        La perspectiva de un programador competitivo.

        • Lea los siguientes libros: Algoritmos de Sedgewick, Introducción a los algoritmos de Cormen et al.
        • Lea los tutoriales de algoritmo TopCoder. Grita a Michal Forišek ( misof ) y Dima Korolev ( DmitryKorolev ).
        • Resuelva los problemas en el Programa de Entrenamiento 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 IO 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.

        Trabaje a su propio ritmo y pida ayuda si se atasca con los problemas.

        En última instancia, cada uno tiene sus propias estrategias de aprendizaje. Tendrás que averiguar qué funciona para ti. Lo más importante es mantenerse motivado y seguir trabajando en ello. Pero si te aburres de aprender sobre los algoritmos y las estructuras de datos, haz algo más.

        [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 realmente allí: Estructuras de datos y algoritmos.

        Entonces, ¿cómo mejorar en 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 lo entenderé por completo. Aquí hay otro enlace para encontrar listas de algoritmos: ¿Cuáles son los algoritmos necesarios para resolver todos los problemas (utilizando C ++) en cualquier concurso de codificación competitivo?

        • Obviamente, esto no cubre todo. Leer el libro de algoritmos de CLRS también será muy agradable.
        • Libros de algoritmos: Si CLRS se considera un libro bastante difícil para los principiantes, ¿cuál es otro gran libro que recomendaría para los 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 deberás estudiar.
      2. No es necesario implementar de inmediato. Asegúrate de entender 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 un pedazo de papel y ser la computadora y hacer cada paso del algoritmo o cada parte de la estructura de datos a mano .
      3. # 2 Practicar, practicar, practicar. Esto debe hacerse simultáneamente con # 1. Nunca solo hagas # 1 o # 2 ; Esto no te ayudará. Necesita implementar Y aprender cómo funciona el algoritmo, de modo que pueda modificarlo como desee.

        • 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 para centrarse en:
        • CodeForces (estructuras de datos): capacidad para ver 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, más editoriales (hay que desbloquear)
        • Otros: páginas de capacitación de USACO, problemas pasados ​​de USACO, HackerEarth, TopCoder, SPOJ *, CodeChef *, jueces en línea *
        • * las soluciones y editoriales son poco frecuentes 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 queda atascado, es posible que haya entendido mal el algoritmo / estructura de datos ( vuelva al paso 1 ) o que consulte un pseudocódigo (en Codechef o HackerEarth Code Monk o TopCoder tutoriales o etc.).

        • Algunos tutoriales sobre estructuras de datos de los que puedes aprender.
        • Tutoriales de ciencia de datos (pseudo-código)
        • Estructuras de datos y algoritmos (enlace anterior)
        • Code Monk – Sea un mejor programador o Notes en HackerEarth (en muchos idiomas diferentes)
      4. El estudio de las estructuras de datos consiste en comprenderlas, no solo en implementarlas. Esto se debe a que cambiar las estructuras de datos para que se ajusten a una pregunta requiere que usted entienda cómo funciona. Por lo tanto, realmente no importa en qué idioma está codificada la estructura de datos; Solo trata de entenderlo haciéndolo a mano.
      5. Del mismo modo, tratar con algoritmos de la misma manera. Los enlaces están arriba para la práctica. Algunos enlaces de referencia (tal vez ayuda?): Algoritmo | Código aceptado
      6. # 4 No te detengas incluso si te quedas atascado. Obtenga ayuda de inmediato. Realice una o varias de las siguientes acciones:

        • Trate de encontrar soluciones de otras personas o leer el editorial. Consigue la idea principal de la solución. Ahora CIERRE la solución e implementa tu sin volver a leer la solución . Esto es muy importante, para que el algoritmo / solución se hunda en su cabeza. Por eso te di algunos sitios web para usar arriba. Tienen editoriales, lo que ayuda mucho.
        • Todos los problemas de codificación tienen patrones. Siempre verás problemas similares todo el tiempo. Por lo tanto, las estrategias y los algoritmos que utilizaste también pasarán por alto. Recuerde las palabras clave que golpean 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 para contener su estrés y pondrán a prueba sus puntos fuertes 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 la preparación de algoritmos / estructura de datos para una programación competitiva, pero la idea de solo aprender algoritmos y estructuras de datos aún se aplica. El punto es la práctica , y la práctica 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 conocimiento de algoritmos? Puedo dar 2 horas al día.

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

        Descargo de responsabilidad: esta no es de ninguna manera una guía completa, pero si es un iniciador, incluso sin ningún conocimiento de C / Java, supongo que esto le ayudará a enfrentar ubicaciones. Sin embargo, le recomendamos que hable con más personas y reciba múltiples aportaciones y haga una estrategia que se ajuste a sus necesidades.
        Paso 1: Idioma
        Incluso si no tiene conocimiento de ningún idioma, no hay necesidad de preocuparse. Le sugiero que comience con C. También puede optar por Java (que tiene sus propias ventajas) pero tomará un tiempo más que C.
        Si está comenzando con C, visite http://www.cprogramming.com primero. Mira todas las video conferencias. Leer libro de Let Us C. Hágase minucioso con conceptos como matrices, cadenas, macros y, en particular, punteros. No se preocupe por las estructuras de datos (listas vinculadas, 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 debe 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 solo asalte, sino que trate de entender los conceptos. No jales el código. Sí, mucha gente hace eso. Ahora, después de terminar estos 6 capítulos, lea el hashing (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 los algos de las cuerdas, pero si el tiempo lo permite, no sigas adelante y haz eso. La programación dinámica, la teoría de grafos no son realmente necesarias a menos que estés aspirando a grandes tiros como Microsoft, Amazon y DirectI.
        Ahora puede parecer mucho para estudiar, pero no es así. De todos modos trata de ser extremadamente minucioso con estos conceptos.
        NOTA: A menos que esté escribiendo un código, todos sus esfuerzos pueden resultar inútiles. Entonces 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 programar de manera eficiente (mejor complejidad de tiempo. ¿Suena extraño? No se preocupe. Hablará mucho sobre la complejidad de 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. Puedes estudiar todos estos temas a partir de las conferencias de video de NPTEL hechas por IITs. Mientras que estas conferencias te dan cantidades extremas de conocimiento, son terriblemente 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 estés estudiando DBMS. Fuente: Tutorial SQL
        OS: No puse mucho esfuerzo en OS. Pero se te aconseja que lo hagas. Aprendí lo poco que hice con el sistema operativo TutorialStart OS después de terminar DSA.
        OOP: Puede aprender OOP de los últimos tutoriales para LISP, jQueryUI, QC, Programación D, JCL, Programación informática, Computación en la nube … Ahora, si solo has estudiado C hasta ahora, es hora de leer un poco de Java. Esto no es necesario, pero es solo para estar en un lado más seguro. Existen numerosas fuentes para aprender Java. Recomiendo Java Tutorials con conferencias de Bucky Robertsvideo por Bucky Roberts (un tiempo total de aproximadamente 12 horas). También 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, así como esta respuesta

        Bien, espero que ahora tenga todo lo que se espera de usted 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 un poco de velocidad. Al mismo tiempo no hay margen para el error en Apti. http: //www.indiabix.com es altamente recomendado para aptitude. Muchas de las preguntas de este sitio son solo levantadas por compañías.

        También hable con otros adultos mayores sobre el contenido de esta respuesta y su estrategia para las ubicaciones y tome su llamada final. ¡La mejor de las suertes!

        Puede comenzar con lo básico sobre matrices, preguntas vinculadas, pilas y preguntas de árboles y luego gráficas, preguntas de programación dinámica. Una vez que haya terminado con estos conceptos, puede intentar resolver problemas avanzados.

        Creo que los videos son una buena manera de entender estos problemas, ya que solo toma unos minutos y recordamos mejor los conceptos cuando 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 estamos claros con el algoritmo, la codificación se vuelve muy fácil.

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

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

        Arrays:

        Listas enlazadas:

        Árboles:

        Grafico:

        Programación dinámica:

        También puedes consultar estos algoritmos aquí:

        Arrays

        Lista enlazada

        Arboles

        Instrumentos de cuerda

        Grafico

        Programación dinámica

        Otros recursos interesantes que me parecieron útiles:

        LeetCode Juez en línea

        Espero que esto ayude.

        Conceptos importantes en estructuras de datos y algoritmos

        1. Lista vinculada – Individual y doble
        2. Apilar
        3. Colas
        4. Árboles binarios de búsqueda o árbol binario general
        5. Muchísimo
        6. Recorrido gráfico básico y camino más corto
        7. Hash

        En mi opinión, los cursos en línea le brindan una mejor comprensión de los conceptos … así que aprenda de los cursos en línea.

        Te sugeriré algunos de los mejores cursos en línea.

        MEJORES ALGORITMOS Y ESTRUCTURAS DE DATOS CURSOS ONLINE ..

        • 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 curso ..

        de este curso, puedes aprender sobre:

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

        Comenzará aprendiendo acerca de la teoría de la complejidad, luego saltará para 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á acerca de las listas vinculadas, como las listas vinculadas individualmente, las listas ordenadas y las vinculadas doblemente. Este video tutorial también cubre matrices, pilas y colas, y clasificación. También aprenderá sobre los algoritmos de búsqueda, tablas hash, recursión y backtracking. Finalmente, cubrirá árboles, árboles equilibrados, árboles de decisión y algoritmos de red.

        y..

        • Aprende 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 de programador.

        2. Introducción a los algoritmos: un enfoque creativo de Udi Manber : un excelente libro sobre varias categorías de algoritmos. En este libro se pueden encontrar muchas preguntas interesantes sobre portales web, como preguntas de entrevista. 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 desea conocer el poder de la inducción como 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 discusiones, historias de guerra, problemas relacionados, ejercicios interesantes. Ayuda a modelar un problema de diferentes maneras. Un libro imprescindible para todo programador apasionado. No leas esto a menos que tengas una buena visió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 los principiantes. Uno puede disfrutar de la explicación y resolver los ejercicios de fin de sección.

        En el estilo de programación:
        1. Programming Pearls by Bentley : un libro que debe leerse sobre el diseño y la implementación de programas de computadora.

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

        3. Programación avanzada en el entorno Unix por W. Richard Stevens – Cubre muchas partes internas de Unix y API de nivel de kernel. Sigue un excelente estilo de programación. Los libros de Stevens son uno de los mejores en su categoría. Yo diría que están al nivel de CLRS en la categoría de algoritmos. Muy recomendable .

        Vamos a hacer algunas matemáticas.
        Para convertirse en un verdadero experto, necesita dedicar unas 10000 horas de trabajo. Pero el año contiene 365 * 24 = 8760 horas, y necesitas dormir algunas veces.
        Pero no se enoje, porque puede conformarse con la mejor opción: puede dejar de ser 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 una especie de deportista profesional, porque la programación es extremadamente 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, entonces concéntrese en la programación competitiva:

        • TopCoder
        • Codeforces
        • SPOJ
        • CodeChef
        • HackerRank

        No sé cuánto tiempo 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 listo para avanzar.