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

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.

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.

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)
Cuente las frecuencias de los elementos de la matriz en el rango de 1 a n (Cuente 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)

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.

Día [matemáticas] -∞ [/ matemáticas] a 0: se adhieren a un lenguaje de programación como C o C ++. Asegúrese de sentirse cómodo con los punteros / objetos.

Día 1: Comprender el concepto de complejidad algorítmica . Omita la teoría por ahora, pero por cada código que escriba, debería poder derivar la complejidad tanto del tiempo como del espacio.

Día 2 – 10: Comencemos con algunas estructuras de datos simples,

  1. Matrices
  2. Listas vinculadas
  3. Instrumentos de cuerda
  4. Pilas
  5. Colas

Comprenda sus operaciones básicas ( insertar, eliminar, buscar, atravesar ) y su complejidad – Hoja de trucos de complejidad de algoritmos Big-O, y codificarlos a todos.

Día 11-25: Aprendamos algunos algoritmos simples,

  1. Clasificación : clasificación por inserción, clasificación por fusión, clasificación rápida, clasificación por montón, clasificación por cubeta, clasificación por conteo, clasificación por radix, clasificación externa
  2. Búsqueda : búsqueda lineal, búsqueda binaria (junto con sus variantes).
  3. Números primos : tamiz de Eratóstenes, prueba de primalidad
  4. Cadenas : búsqueda de cadenas, LCS, detección de palíndromo
  5. Varios : algoritmo euclidiano, multiplicación de matrices, números de Fibonacci, triángulo de Pascal, problema de Max Subarray

Día 26 – 50: una vez que se sienta cómodo con todo lo anterior, comience a resolver problemas desde,

  1. Romper la entrevista de codificación
  2. Elementos de las entrevistas de programación
  3. Programación de entrevistas expuestas: secretos para conseguir tu próximo trabajo
  4. GeeksforGeeks
  5. HackerRank
  6. EntrevistaBit

Apéguese a capítulos de matrices, listas vinculadas, cadenas, pilas, colas y complejidad.

Día 51 – 60: aprendamos algunas estructuras de datos no lineales,

  1. Árbol
  1. Árbol binario, Árbol de búsqueda binaria : recorridos de árbol, ancestro común más bajo, profundidad, altura y diámetro, encontrar el elemento más pequeño
  2. Muchísimo
  • Tabla hash : problema de 4 sumas, comprobando si la solución de sudoku es válida
  • Gráfico : búsqueda de amplitud primero, búsqueda de profundidad primero, clasificación topológica, árbol de expansión mínima, problema de ruta más corta,
  • Día 61-90: Consulte los recursos anteriores y comience a resolver problemas de árboles, tablas hash, montones y gráficos.

    Día 91 – 100: Comprenda la teoría de la complejidad computacional y la completitud NP, el problema de la mochila, el problema del vendedor ambulante, el problema del SAT, etc.

    Día 101 – [matemáticas] ∞ [/ matemáticas] : Ahora eres mejor que la mayoría de los estudiantes de CS. ¡Sigue revisando los temas anteriores y comienza una programación competitiva! ¡Buena suerte!

    Gracias por el A2A Meghna Bhasin

    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 de 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.

    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. todos. 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

    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 de 2X3 pies) con plumero ( menos de 1200 rupias) al comienzo, 2 marcadores de pizarra blanca para escribir , tinta de recarga de marcador de pizarra blanca – 10 cajas (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 10K, más de 100 rangos más o menos, de esta manera aprenderás mejor y progresarás rápidamente hacia Top 100.

    Algunos buenos libros (que nunca leí), vea 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.

    [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?
  • 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.
  • 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 .
  • # 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 el algoritmo / estructura de datos ( Vuelva 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)
  • 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.
  • 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
  • # 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 🙂

    Introducción a los algoritmos, tercera edición, de Cormen, Leiserson, Rivest y Stein es una buena introducción a los algoritmos y las estructuras de datos. Tiene muchos ejercicios al final de cada capítulo. la mayoría de ellos son simples, pero hay algunos más difíciles.

    Algunos recursos en línea:

    1.Geeks para geeks
    Este es uno de los mejores portales informáticos para geeks, principalmente enfocado en estructuras de datos y algoritmos. El análisis de algoritmos, búsqueda y clasificación, algoritmos codiciosos, programación dinámica, búsqueda de patrones, retroceso, división y conquista y algoritmos de bits se explican claramente.

    2. Top codificador
    Top coder es uno de los sitios de concurso de codificación que se enfoca principalmente en preguntas algorítmicas. Aquí está la buena colección de temas algorítmicos de varios miembros del topcoder.

    3. OpenclassRoom- Universidad de Stanford
    Aquí está la colección de tutoriales en video del profesor Tim Roughgarden de la Universidad de Stanford. Los temas discutidos aquí son Introducción a técnicas fundamentales para diseñar y analizar algoritmos, incluido el análisis asintótico; dividir y conquistar algoritmos y recurrencias; algoritmos codiciosos; estructuras de datos; programación dinámica; algoritmos gráficos; y algoritmos aleatorios

    4. Introducción a los algoritmos – Massachusetts Institute of Technology
    Aquí está la colección de diapositivas de conferencias, código sobre varios temas algorítmicos por el instituto de tecnología de Massachusetts

    5. Stanford CS Education Library
    Esta biblioteca en línea recopila material educativo de CS de los cursos de Stanford y los distribuye de forma gratuita.

    Aquí hay algunos sitios más que pueden ayudarlo a aprender estructuras de datos y algoritmos:
    1. CSE 214 – Notas de clase
    2.Lecturas en estructuras de datos avanzadas (6.851)
    3. CS 61B: estructuras de datos
    4.Coursera
    5. https://www.coursera.org/course/
    6. Página sobre Careercup
    7.Página en Careercup
    8 LeetCode
    9 preguntas más recientes sobre ‘estructuras de datos’
    10. Preguntas más recientes sobre ‘algoritmos’
    11 Curso de Introducción a los Algoritmos en línea

    La Estructura de datos es una forma de recopilar y organizar datos de tal manera que podamos realizar operaciones sobre estos datos de manera efectiva. Data Structures se trata de representar elementos de datos en términos de alguna relación, para una mejor organización y almacenamiento. Por ejemplo, tenemos el nombre del jugador de datos “Virat” y 26 años. Aquí “Virat” es del tipo de datos de cadena y 26 es del tipo de datos enteros .

    Podemos organizar estos datos como un registro como el registro del jugador . Ahora podemos recopilar y almacenar los registros de los jugadores en un archivo o base de datos como estructura de datos. Por ejemplo: “Dhoni” 30, “Gambhir” 31, “Sehwag” 33

    En un lenguaje simple, las estructuras de datos son estructuras programadas para almacenar datos ordenados, de modo que varias operaciones se pueden realizar fácilmente.

    Como discutimos anteriormente, cualquier cosa que pueda almacenar datos puede llamarse como una estructura de datos, por lo tanto, Integer, Float, Boolean, Char, etc., son estructuras de datos. Se les conoce como estructuras de datos primitivas .

    Luego también tenemos algunas estructuras de datos complejas, que se utilizan para almacenar datos grandes y conectados. Algunos ejemplos de estructura de datos abstractos son Para obtener más información, puede visitar este enlace C y clases de capacitación sobre estructuras de datos en línea | C y Cursos de estructuras de datos en línea

    Todas estas estructuras de datos nos permiten realizar diferentes operaciones en los datos. Seleccionamos estas estructuras de datos en función del tipo de operación que se requiere. Analizaremos estas estructuras de datos con más detalles en nuestras lecciones posteriores.

    Un algoritmo es un conjunto finito de instrucciones o lógica, escritas en orden, para realizar una determinada tarea predefinida. El algoritmo no es el código o programa completo, es solo la lógica central (solución) de un problema, que puede expresarse como una descripción informal de alto nivel como pseudocódigo o mediante un diagrama de flujo .

    Se dice que un algoritmo es eficiente y rápido, si lleva menos tiempo ejecutarlo y consume menos espacio de memoria. El rendimiento de un algoritmo se mide sobre la base de las siguientes propiedades:

    1. Complejidad de tiempo
    2. Complejidad espacial
    3. Es la cantidad de espacio de memoria requerida por el algoritmo, durante el curso de su ejecución. La complejidad del espacio debe tomarse en serio para los sistemas multiusuario y en situaciones donde hay memoria limitada disponible.

    Un algoritmo generalmente requiere espacio para los siguientes componentes:

    • Espacio de instrucciones: es el espacio requerido para almacenar la versión ejecutable del programa. Este espacio es fijo, pero varía según el número de líneas de código en el programa.
    • Espacio de datos: es el espacio requerido para almacenar todas las constantes y el valor de las variables.
    • Espacio del entorno: es el espacio requerido para almacenar la información del entorno necesaria para reanudar la función suspendida
    • Time Complexity es una forma de representar la cantidad de tiempo que necesita el programa para ejecutarse hasta su finalización. Estudiaremos esto en detalle en nuestra sección.
      para (i = 0; i 
    

    La complejidad temporal para el algoritmo anterior será lineal . El tiempo de ejecución del ciclo es directamente proporcional a N. Cuando N se duplica, también lo hace el tiempo de ejecución.

      for (i = 0; i 
    

    Esta vez, la complejidad del tiempo para el código anterior será cuadrática . El tiempo de ejecución de los dos bucles es proporcional al cuadrado de N. Cuando N se duplica, el tiempo de ejecución aumenta en N * N.

      while (bajo <= alto) {mid = (bajo + alto) / 2;  if (target  list [mid]) low = mid + 1;  de lo contrario romper;  }
    

    Este es un algoritmo para dividir un conjunto de números en mitades, para buscar un campo en particular (lo estudiaremos en detalle más adelante). Ahora, este algoritmo tendrá una Complejidad de tiempo logarítmica . El tiempo de ejecución del algoritmo es proporcional al número de veces que N puede dividirse entre 2 (N es alto-bajo aquí). Esto se debe a que el algoritmo divide el área de trabajo por la mitad con cada iteración.

      void quicksort (int list [], int left, int right) {int pivot = partición (list, left, right);  clasificación rápida (lista, izquierda, pivote - 1);  clasificación rápida (lista, pivote + 1, derecha);  }
    

    Llevando adelante el algoritmo anterior, arriba tenemos una pequeña lógica de clasificación rápida (estudiaremos esto en detalle más adelante). Ahora en Clasificación rápida, dividimos la lista en mitades cada vez, pero repetimos la iteración N veces (donde N es el tamaño de la lista). Por lo tanto, la complejidad del tiempo será N * log (N) . El tiempo de ejecución consta de N bucles (iterativos o recursivos) que son logarítmicos, por lo que el algoritmo es una combinación de lineal y logarítmico.

    NOTA: En general, hacer algo con cada elemento en una dimensión es lineal, hacer algo con cada elemento en dos dimensiones es cuadrático, y dividir el área de trabajo por la mitad es logarítmico.

    Tipos de anotaciones para la complejidad del tiempo

    Ahora discutiremos y entenderemos las diversas notaciones utilizadas para la Complejidad del Tiempo.

    1. Big Oh denota iteraciones " menores o iguales que ".
    2. Big Omega denota iteraciones " más que o iguales que ".
    3. Big Theta denota iteraciones " iguales que ".
    4. Little Oh denota " menos que " iteraciones.
    5. Little Omega denota " más que " iteraciones.

    Comprender las anotaciones de la complejidad del tiempo con un ejemplo

    O (expresión) es el conjunto de funciones que crecen más lentamente o al mismo ritmo que la expresión.

    Omega (expresión) es el conjunto de funciones que crecen más rápido o al mismo ritmo que la expresión.

    Theta (expresión) consiste en todas las funciones que se encuentran tanto en O (expresión) como en Omega (expresión).

    Para obtener más información, puede visitar este enlace C y clases de capacitación sobre estructuras de datos en línea | C y Cursos de estructuras de datos en línea

    Suponga que ha calculado que un algoritmo toma operaciones f (n), donde,

      f (n) = 3 * n ^ 2 + 2 * n + 4. // n ^ 2 significa cuadrado de n
    

    Como este polinomio crece a la misma velocidad que n ^ 2 , entonces se podría decir que la función f se encuentra en el conjunto Theta (n ^ 2) . (También se encuentra en los conjuntos O (n ^ 2) y Omega (n ^ 2) por la misma razón).

    La explicación más simple es, porque Theta denota lo mismo que la expresión. Por lo tanto, como f (n) crece por un factor de n ^ 2 , la complejidad del tiempo puede representarse mejor como Theta (n ^ 2) .

    C Programming and Data Structures es un curso básico diseñado para capacitar en conceptos básicos de informática, organización de memoria, preprocesador, compilador y vinculador. Proporciona un excelente aprendizaje para crear su primer programa C y sesiones de práctica sobre tipos de datos y operadores, variables y calificadores, flujo de control, funciones en C, recursión, matrices, cadenas. El curso incluye además punteros en C y operaciones avanzadas de estructuras de datos como aritmética de punteros, matrices multidimensionales, asignación dinámica de memoria, estructuras, listas vinculadas, uniones, búsqueda y clasificación, operaciones de archivos y funciones de cadena.

    Mi recomendación principal sería que en cada paso del camino, debe considerar qué tipo de lógica podría haber llevado a alguien a inventar la estructura de datos o el algoritmo.

    Aquí está la cosa: las ideas no salen de la nada . Las personas a menudo tratan estos temas como si constaran de hechos que son exactamente como son , y solo tienes que memorizarlos. Pero, ya sabes, los creadores de estas ideas tenían algún tipo de intuición que los llevó al descubrimiento, y tú también puedes tener esa intuición por ti mismo.

    Cada vez que vea un nuevo algoritmo o una solución creativa para un problema algorítmico, debe pensar: “¿cómo se le ocurrió a alguien la idea de hacer esto? ¿Qué podría haber pensado que me hubiera dado la misma idea?”

    También es importante que te vuelvas bueno en el razonamiento formal, las pruebas y el cálculo de las complejidades de Big-O al principio del proceso, ya que estas son tus herramientas principales al razonar sobre algoritmos.

    Aquí hay algunas publicaciones relacionadas sobre el pensamiento intuitivo sobre estructuras de datos y algoritmos:

    Sobre aprender la intuición detrás de una idea:
    La respuesta de Eugene Yarovoi a la habilidad algorítmica / resolución de problemas / programación competitiva: ¿Cómo entrenar de manera más inteligente?

    Acerca de las ideas básicas que conducen a estructuras de datos básicas:
    La respuesta de Eugene Yarovoi a ¿Cuáles son las principales aplicaciones de las estructuras de datos?

    Vaya a Timus Online Judge y trabaje en orden. Si te aburres, salta algunas formas. Si no puede resolver el problema, mire el foro por problema. Si eso no ayuda, pregúntale a alguien (como StackOverflow, o un amigo, o Quora, o …)

    Una vez que haya hecho 50-100 de esos, puede escribir algo de código y tal vez conocer algunos algoritmos básicos. Ve a Codeforces y haz sus concursos semanales. Haz concursos TopCoder también. Cuando no tenga problemas, resuélvalos después.

    Una vez que ingresas a Div 1 en Codeforces / TopCoder, tienes algunas habilidades:
    1) Usted es un algoritmo / estructura de datos “experto”. Probablemente sepa tanto como la mayoría de los estudiantes universitarios en las mejores escuelas de CS y lo suficiente para conseguir un trabajo en Google o similar.
    2) En realidad, puedes escribir código, que aparentemente es una habilidad sorprendentemente rara.

    Todavía te faltan muchos conocimientos de programación:
    1) ¿Qué son los hilos? ¿Cómo resuelvo los problemas de concurrencia?
    2) ¿Cómo funciona realmente la gestión de memoria? ¿Cómo funcionan realmente las llamadas a funciones? ¿Cómo funciona realmente la programación de hilos?
    3) ¿Cómo se comunican las computadoras entre sí? ¿Cómo funciona realmente Internet?
    4) ¿Cómo hago que aparezcan cosas en la pantalla con las que las personas pueden interactuar?

    No conozco formas tan simples de aprender esas cosas. Algunas sugerencias:
    – Escriba un sistema operativo para aprender # 1 y # 2. (Creo que hay cursos en línea. Quizás)
    – Escribe un juego para aprender # 4
    – Escribe un juego multijugador para aprender # 3

    * Obtenga competencia en C y uno de los lenguajes OOPS .

    * Sea práctico con estructuras de datos y algoritmos .
    Una introducción a los algoritmos de Thomas H Cormen es el mejor libro para esto.

    * Regístrese en sitios de programación como Codechef, Topcoders, SPOJ y practique regularmente diferentes problemas.

    Aquí conocerá las Aplicaciones de diferentes ESTRUCTURAS DE DATOS .

    * Participa en concursos de programación como Google Codejam ,
    FHC etc.

    Y por ultimo—-
    como comer y dormir, hacer que la codificación forme parte de tu vida .
    Mucha suerte 😀

    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 perdí 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. 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. 🙂

    Un buen método para fortalecer su conocimiento de la ciencia de datos es colaborar con otros científicos de datos utilizando algunas herramientas de código abierto en algún proyecto de DS abierto.

    Existen herramientas similares a Kaggle Kernels, como la nueva herramienta de código abierto DVC, que comparte el proyecto DS a través de Git (código) y almacenes en la nube (datos) y considera el modelado de aprendizaje automático como un proceso iterativo y realiza un seguimiento de sus pasos, dependencias entre pasos, dependencias entre su código, argumentos de ejecución de código (almacenados en Git) y archivos de datos (almacenados en almacenes en la nube como S3 o GCP) – Versión beta de Data Version Control

    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 )
  • Etapa 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, siéntase libre de masajearme en quora.

    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 forma 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.

    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.

    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

    More Interesting

    ¿Cuáles son algunos algoritmos de Photoshop?

    ¿Qué consejo le da Ashish Kedia al estudiante de ingeniería de software de último año que no es un buen programador para convertirse en un gran ingeniero? Aprobé las asignaturas, pero no tomé ninguna clase de algo, y mis habilidades para resolver problemas son bajas.

    ¿Es la codificación competitiva todo sobre estructuras de datos y algoritmos?

    ¿Te gusta la categoría de algoritmos de 'programación dinámica'?

    ¿Estoy perdiendo el tiempo implementando la estructura de datos elementales (Stacks, Queues y LinkedLists) como parte de la preparación para una entrevista de prácticas en Google?

    ¿Qué es la ordenación de tramas en las redes?

    ¿El hashing criptográfico es una buena manera de identificar imágenes de forma exclusiva?

    ¿Cuál es la diferencia entre matriz y estructura en la programación?

    ¿Existe un algoritmo que pueda combinar y separar números?

    Cómo calcular la O grande de: for (int k = 2; k <floor (sqrt (n)); k ++)

    ¿Cómo se usa la similitud de coseno con el algoritmo K-means?

    ¿Cuáles son algunos algoritmos divertidos para practicar?

    ¿Qué tan difícil es implementar un sitio web de reserva de boletos con un volumen máximo de 1 millón de boletos por hora durante ciertas horas del día?

    ¿Qué necesitamos antes de comenzar las estructuras de datos?

    Puedo pensar en algoritmos en varias preguntas, pero cuando realmente escribo un código me enfrento a muchas dificultades. Entonces, siento que soy pobre escribiendo códigos. ¿Cómo puedo mejorar eso?