¿Cómo empiezo a aprender o a 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.

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.

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.

Día [math] -∞ [/ math] a 0: se adhiere a un lenguaje de programación como C o C ++. Asegúrese de estar cómodo con los punteros / objetos.

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

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

  1. Arrays
  2. Listas enlazadas
  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 del algoritmo Big-O y codifíquelas todas.

Día 11 – 25: Ahora aprendamos algunos algoritmos simples,

  1. Clasificación : clasificación de inserción, clasificación de fusión, clasificación rápida, clasificación de montón, clasificación de cubo, clasificación de recuento, clasificación de Radix, clasificación externa
  2. BúsquedaBúsqueda lineal, Búsqueda binaria (junto con sus variantes).
  3. Números primos – Tamiz de eratóstenes, prueba de primalidad
  4. CadenasBú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 del subarray máximo

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

  1. Cracking la entrevista de codificación
  2. Elementos de las entrevistas de programación
  3. Programación de entrevistas expuestas: Secretos para aterrizar su próximo trabajo
  4. GeeksforGeeks
  5. HackerRank
  6. EntrevistaBit

Se adhieren a los 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 árboles, ancestro común más bajo, profundidad, altura y diámetro, encontrando el elemento más pequeño en k-th
  2. Muchísimo
  • Tabla de hash – problema de 4 sumas, verificando si la solución de sudoku es válida
  • Gráfico – Búsqueda en anchura, Búsqueda en profundidad en primer lugar, 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: Entienda la teoría de la complejidad computacional y la integridad del NP, el problema de la mochila, el problema del vendedor ambulante, el problema del SAT y demás.

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

    Gracias por la A2A Meghna Bhasin

    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.

    [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?
  • 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.
  • 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 .
  • # 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)
  • 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.
  • 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
  • # 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 🙂

    Introduction to Algorithms, Third Edition, 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, que se centran principalmente en las estructuras de datos y los algoritmos. El análisis de los algoritmos, la búsqueda y clasificación, los algoritmos codiciosos, la programación dinámica, la búsqueda de patrones, el retroceso, la división y la conquista y los algoritmos de bits se explican con claridad.

    Codificador superior
    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 por parte de varios miembros topcoder.

    3. OpenclassRoom- Universidad de Stanford
    Aquí está la colección de videos tutoriales por el profesor Tim Roughgarden de la universidad de Stanford. Los temas que se tratan aquí son Introducción a las técnicas fundamentales para diseñar y analizar algoritmos, incluido el análisis asintótico; algoritmos de división y conquista y recurrencias; algoritmos codiciosos; estructuras de datos; programación dinámica; algoritmos gráficos; y algoritmos aleatorios

    4. Introducción a los algoritmos – Instituto de Tecnología de Massachusetts
    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 – Apuntes de clase
    2.Lectures en Estructuras de Datos Avanzadas (6.851)
    3. CS 61B: Estructuras de datos
    4.Coursera
    5. https://www.coursera.org/course/…
    6. Página en Careercup
    7.Page en Careercup
    8 LeetCode
    9 preguntas más recientes sobre ‘estructuras de datos’: desbordamiento de pila
    10. Más recientes preguntas de ‘algoritmo’ – Desbordamiento de pila
    11 Curso de Introducción a los Algoritmos Online

    La estructura de datos es una forma de recopilar y organizar datos de tal manera que podamos realizar operaciones sobre estos datos de una 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 la edad 26. Aquí “Virat” es del tipo de datos String 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 del jugador en un archivo o base de datos como una estructura de datos. Por ejemplo: “Dhoni” 30, “Gambhir” 31, “Sehwag” 33

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

    Como hemos comentado anteriormente, cualquier cosa que pueda almacenar datos puede ser llamada como una estructura de datos, por lo tanto, Integer, Float, Boolean, Char, etc., todas son estructuras de datos. Son conocidos como estructuras de datos primitivos .

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

    Todas estas estructuras de datos nos permiten realizar diferentes operaciones sobre los datos. Seleccionamos estas estructuras de datos según el tipo de operación que se requiera. Examinaremos estas estructuras de datos con más detalle en nuestras lecciones posteriores.

    Un algoritmo es un conjunto finito de instrucciones o lógica, escrito 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 se tarda menos tiempo en ejecutarse y consume menos espacio de memoria. El rendimiento de un algoritmo se mide sobre la base de las siguientes propiedades:

    1. Complejidad del 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 la memoria limitada está 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 de entorno: es el espacio necesario para almacenar la información de entorno necesaria para reanudar la función suspendida
    • La complejidad del tiempo es una forma de representar la cantidad de tiempo que necesita el programa para ejecutarse hasta su finalización. Vamos a estudiar esto en detalle en nuestra sección.
      para (i = 0; i 
    

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

      para (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) {medio = (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 se puede dividir entre 2 (N es alto-bajo aquí). Esto se debe a que el algoritmo divide el área de trabajo a la mitad con cada iteración.

      void quicksort (int list [], int left, int right) {int pivot = partition (list, izquierda, derecha);  quicksort (list, left, pivot - 1);  quicksort (lista, pivote + 1, derecha);  }
    

    Tomando el algoritmo anterior hacia adelante, arriba tenemos una pequeña lógica de Ordenación rápida (estudiaremos esto en detalle más adelante). Ahora, en Ordenació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 consiste en 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 notaciones para la complejidad del tiempo

    Ahora discutiremos y entenderemos las diversas notaciones utilizadas para la complejidad del tiempo.

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

    Entendiendo las notaciones de la complejidad del tiempo con el 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 formación de estructuras de datos en línea | Cursos de C y Estructuras de Datos en línea

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

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

    Como este polinomio crece a la misma velocidad que n ^ 2 , entonces podría decirse 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 sencilla es que Theta denota lo mismo que la expresión. Por lo tanto, a medida que f (n) crece por un factor de n ^ 2 , la complejidad del tiempo puede representarse mejor como Theta (n ^ 2) .

    C Programación y Estructuras de datos es un curso básico diseñado para brindar capacitación sobre conceptos básicos de computadoras, organización de memoria, preprocesador, compilador y vinculador. Proporciona un excelente aprendizaje para crear su primer programa en 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 de memoria dinámica, 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, debería 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 del aire . Las personas a menudo tratan estos temas como si estuvieran formados por hechos tal como son , y usted solo tiene que memorizarlos. Pero, 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 para ti.

    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? ¿En qué podría haber pensado que me hubiera dado la misma idea?”

    También es importante que sea bueno en el razonamiento formal, las pruebas y el cálculo de las complejidades de la O grande al principio del proceso, ya que estas son sus herramientas principales cuando razonan sobre los algoritmos.

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

    Acerca de 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 los conocimientos básicos que conducen a estructuras de datos básicos:
    La respuesta de Eugene Yarovoi a ¿Cuáles son las principales aplicaciones de las estructuras de datos?

    Diríjase a Timus Online Judge y trabaje en orden. Si te aburres, sáltate un camino. Si no puede resolver el problema, consulte el foro por problema. Si eso no ayuda, pregúntele 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 quizás conocer algunos algoritmos básicos. Ve a Codeforces y haz sus concursos semanales. Hacer concursos TopCoder también. Cuando no tengas problemas, resuélvelos después.

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

    Todavía te falta un montón de conocimientos de programación:
    1) ¿Qué son los hilos? ¿Cómo resuelvo 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:
    – Escribe un sistema operativo para aprender # 1 y # 2. (Creo que hay cursos en línea. Tal vez)
    – Escribir un juego para aprender # 4.
    – Escribe un juego multijugador para aprender # 3.

    * Obtener dominio en C y uno de los idiomas de OOPS .

    * Sea práctico con estructuras de datos y algoritmos .
    Una introducción a los algoritmos por 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á aplicaciones de diferentes ESTRUCTURAS DE DATOS .

    * Participar en competiciones de programación como Google Codejam ,
    FHC etc.

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

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

    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.

    la mejor de las suertes

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

    Regresar a: Recursos todo en uno de CS y CP por Manohar Reddy Poreddy en AlgorithmsAndMore

    Un buen método para reforzar 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 de DS a través de Git (código) y los 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 los 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

    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.

    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)
    Desplazamiento de la orden del nivel del árbol binario (Transversal de la orden del nivel del árbol binario)
    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 a partir de una matriz ordenada (Crear un árbol de búsqueda binario 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 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)
    Encuentre el piso y el techo de un elemento a partir del conjunto de datos dado utilizando 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 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)

    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 intensiva en 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.

    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 .

    Tengo algunos libros que recomiendo mucho.

    Algoritmos

    1) Algorithm Design 1st Edition por Jon Kleinberg, Eva Tardos – Uno de los mejores libros para Algorithms y hace un gran esfuerzo para que entiendas la intención detrás del Algorithm, que me ha gustado mucho.

    2) El manual de diseño de algoritmos de Steven S. Skiena: una vez que haya superado Kleinberg, este libro le presentará una amplia gama de problemas, este libro es un ejemplo de libro de ejemplo y, por lo tanto, puede necesitar conocimientos de nivel básico.

    Teoría de grafos

    Me especialicé en eso y, por lo tanto, aunque no los necesites, sugiero lo siguiente.

    1) Introducción a Graph Theory 2nd Edition por Douglas B West. – Este es mi libro favorito, y tiene casi todo en teoría de grafos, pero carece de una idea internacional.
    2) Graph Theory 01 Edition por Harary: un libro clásico que es fácil de leer pero muy antiguo de Harary, presenta la teoría de Graph maravillosamente.
    3) Graph Theory 0004 Edition por Reinhard Diestel – Libro de texto estándar para la teoría de Graph, y hace un buen trabajo en eso, pero personalmente me gustan más los dos libros anteriores por diferentes motivos.

    Referencias

    1) Introducción a Algorithms 3 Edition: este libro me parece útil solo como referencia, cuando necesito saber cosas, los algoritmos y las estructuras de datos se presentan tal como están, sin ninguna cantidad de intuición ni nada. Pero si tiene alguna duda técnica sobre los algoritmos, es probable que este libro la responda. Así que por favor use esto como un libro de referencia. Es probable que encuentre mejores libros de texto para cada uno de los temas en CLRS.

    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.