¿Qué algoritmos y estructuras de datos debe conocer cualquier ingeniero de software?

www.codingeek.org

1. Divide y vencerás: un algoritmo de dividir y vencerás funciona dividiendo recursivamente un problema en dos o más subproblemas del mismo tipo (o relacionado) ( división ), hasta que estos se vuelvan lo suficientemente simples como para ser resueltos directamente ( conquistar ). Las soluciones a los subproblemas se combinan para dar una solución al problema original.

Esta técnica de divide y vencerás es la base de algoritmos eficientes para todo tipo de problemas, como (por ejemplo, QuickSort, Merge Sort), multiplicar grandes números (por ejemplo, Karatsuba), análisis sintáctico (por ejemplo, analizadores de arriba hacia abajo) y calcular el transformada discreta de Fourier (FFT).

2. Programación dinámica : es un método para resolver un problema complejo dividiéndolo en una colección de subproblemas más simples, resolviendo cada uno de esos subproblemas una sola vez y almacenando sus soluciones, idealmente, utilizando una estructura de datos basada en memoria. La próxima vez que ocurra el mismo subproblema, en lugar de volver a calcular su solución, uno simplemente busca la solución previamente calculada, ahorrando así el tiempo de cálculo a expensas de un gasto (con suerte) modesto en espacio de almacenamiento. (Cada una de las soluciones de subproblemas está indexada de alguna manera, típicamente basada en los valores de sus parámetros de entrada, para facilitar su búsqueda.) La técnica de almacenar soluciones a subproblemas en lugar de volver a calcularlas se llama “memorización”.

Los algoritmos de programación dinámica se utilizan para la optimización (por ejemplo, encontrar la ruta más corta entre dos puntos o la forma más rápida de multiplicar muchas matrices). Un algoritmo de programación dinámica examinará los subproblemas resueltos previamente y combinará sus soluciones para dar la mejor solución para el problema dado. Las alternativas son muchas, como el uso de un Algoritmo codicioso, que elige la opción óptima local en cada rama en el camino. La elección óptima local puede ser una mala elección para la solución general. Si bien un algoritmo codicioso no garantiza una solución óptima, a menudo es más rápido de calcular. Afortunadamente, se ha demostrado que algunos algoritmos codiciosos (como el árbol de expansión mínimo) conducen a la solución óptima.

3) Algoritmos de gráficos: los gráficos se pueden usar para modelar muchos tipos de relaciones y procesos en sistemas físicos, biológicos, sociales y de información. Muchos problemas prácticos se pueden representar mediante gráficos.

En informática, los gráficos se utilizan para representar redes de comunicación, organización de datos, dispositivos computacionales, el flujo de cómputo, etc. Por ejemplo, la estructura de enlaces de un sitio web se puede representar mediante un gráfico dirigido, en el que los vértices representan páginas web y los bordes dirigidos representan enlaces de una página a otra. Se puede adoptar un enfoque similar para los problemas en viajes, biología, diseño de chips de computadora y muchos otros campos. Por lo tanto, el desarrollo de algoritmos para manejar gráficos es de gran interés en informática. La transformación de gráficos a menudo se formaliza y se representa mediante sistemas de reescritura de gráficos. Complementarios a los sistemas de transformación de gráficos que se centran en la manipulación de gráficos en memoria basada en reglas, hay bases de datos de gráficos orientadas al almacenamiento y consulta persistentes y seguros de transacciones de datos estructurados con gráficos.

4. Algoritmo codicioso : es un algoritmo que sigue la heurística de resolución de problemas de hacer la elección óptima local en cada etapa con la esperanza de encontrar un óptimo global. En muchos problemas, una estrategia codiciosa en general no produce una solución óptima, pero, sin embargo, una heurística codiciosa puede producir soluciones óptimas a nivel local que se aproximan a una solución óptima global en un tiempo razonable.

Por ejemplo, una estrategia codiciosa para el problema del vendedor ambulante (que es de alta complejidad computacional) es la siguiente heurística: “En cada etapa, visite una ciudad no visitada más cercana a la ciudad actual”. Esta heurística no necesita encontrar la mejor solución, sino que termina en un número razonable de pasos; encontrar una solución óptima generalmente requiere irrazonablemente muchos pasos. En la optimización matemática, los algoritmos codiciosos resuelven problemas combinatorios que tienen las propiedades de los matroides.

5. Retroceso : es un algoritmo general para encontrar todas (o algunas) soluciones a algunos problemas computacionales, en particular los problemas de satisfacción de restricciones, que aumenta gradualmente los candidatos a las soluciones y abandona a cada candidato parcial c (“retrocesos”) tan pronto como determina que c no se puede completar con una solución válida.

El ejemplo clásico de libros de texto del uso del retroceso es el rompecabezas de las ocho reinas, que pide todos los arreglos de ocho reinas de ajedrez en un tablero de ajedrez estándar para que ninguna reina ataque a ningún otro. En el enfoque común de retroceso, los candidatos parciales son arreglos de k reinas en las primeras k filas del tablero, todas en diferentes filas y columnas. Cualquier solución parcial que contenga dos reinas que se ataquen mutuamente puede ser abandonada.

El retroceso se puede aplicar solo para problemas que admiten el concepto de una “solución candidata parcial” y una prueba relativamente rápida de si posiblemente se puede completar con una solución válida. Es inútil, por ejemplo, para localizar un valor dado en una tabla desordenada. Sin embargo, cuando es aplicable, el retroceso es a menudo mucho más rápido que la enumeración de la fuerza bruta de todos los candidatos completos, ya que puede eliminar una gran cantidad de candidatos con una sola prueba.

Estoy encantado de ver que he logrado obtener dos títulos de posgrado, un postdoctorado y un puesto de científico de personal en ciencias de la computación sin tener que codificar ninguno de los algoritmos enumerados en las otras respuestas aquí. (Ok, una vez que codifiqué un árbol de 8 arios para una simulación de biología. Pero eso no tuvo nada que ver con mi investigación real).

Mi lista es la siguiente. He ampliado las definiciones de “algoritmo” y “estructura de datos” para adaptarme a mi propósito. Si no te gusta, hay muchas otras respuestas aquí para disfrutar.

0. RTFM. No saldrás de las filas de los aspirantes hasta que domines este algoritmo.

1. PageRank. Encontrar información en la web es un proceso algorítmico, y algunos algoritmos son mucho más efectivos que otros. Usar motores de búsqueda debería ser una segunda naturaleza.

2. Git. Piense en ello como una estructura de datos.

3. Fuerza bruta. Debido a que el software lento y correcto es mucho más valioso que el software rápido e incorrecto (sobre todo porque el software lento y correcto se puede hacer más rápido mucho más fácil que rápido, el software incorrecto se puede corregir).

4. El dispositivo de Duff. Hay ideas que no se pueden expresar en pseudocódigo.

5. Unix tuberías. A medida que avanzan los algoritmos, este cambió nuestra forma de pensar sobre la informática.

6. Pin / Dyninst. La ejecución en sí misma puede considerarse como una estructura de datos y ser operada, si eres lo suficientemente malvado.

7. rdmsr / wrmsr. No podría ser más simple: leer un valor de un registro y escribir un valor en un registro. Excepto que este algoritmo te obliga a dejar de pensar en el procesador como un cuadro negro.

8. Barreras sin bloqueo. Comprenda cómo funcionan y por qué son útiles y la computación distribuida no tendrá terrores para usted.

9. setjmp / longjmp. Algunos cuchillos son más afilados que otros. Vea las Coroutinas de Kelly Martin, el operador ternario, y la naturaleza del mal.

Como todo el mundo ha mencionado en este hilo, hay un conjunto común de estructuras de datos y algoritmos que necesita saber para realizar la programación básica. Esto incluye listas, árboles, mapas, hashing, clasificación, etc. Si está interesado en el desarrollo de software empresarial típico, bastará con una comprensión básica de estos. Sin embargo, al mismo tiempo, debe conocer las diferencias básicas y sutiles entre las implementaciones estrechamente relacionadas de cada una de ellas. Una de las preguntas que principalmente hago en una entrevista Java es la diferencia en las características de rendimiento de una ArrayList y una LinkedList. Lamentablemente, muy pocas personas pueden dar la respuesta correcta.

En un hilo relacionado, discutí la importancia de diseñar la estructura de datos correcta para su problema (¿Cuál es la importancia de diseñar la estructura de datos correcta?).

Conocer los conceptos básicos de una estructura de datos es un aspecto. Pero si está trabajando en un problema que necesita un rendimiento adicional, es posible que deba realizar esa optimización adicional para su estructura de datos. Considere las listas vinculadas, el alimento básico para almacenar elementos de manera vinculada. Pero si necesita obtener más rendimiento de esta implementación vinculada, puede optar por una Lista vinculada desenrollada ( http://en.wikipedia.org/wiki/Unr …). No hay nada de lujos en una lista vinculada desenrollada. Almacena una matriz de elementos en cada nodo en lugar de uno solo, lo que aumenta la localidad de sus punteros y, por lo tanto, hace que su estructura de datos sea mucho más amigable con la caché. No es tan frecuente que tenga la oportunidad de usar una lista vinculada desenrollada. Pero cuando puede, es útil tener esas técnicas de optimización como parte de su repertorio.

Por lo tanto, la idea general es aprender los principios básicos de las estructuras de datos comúnmente utilizadas (listas, árboles, hashes, mapas, etc.), pero vigile las variabilidades de las implementaciones que cada una puede tener.

Honestamente, para la ingeniería de software de propósito general, estimaría que el 99% de los casos de uso se pueden manejar adecuadamente con punteros (indirección) y la lista de lista, mapa y estructura de datos en su lenguaje de programación. Si sabe cuándo y cómo usarlos al máximo, puede llegar lejos. Quizás la habilidad más importante es saber cuándo y cómo reemplazar una operación de tiempo O (n) con una operación de tiempo O (1) u O (log n) de su biblioteca estándar.

Debe conocer las compensaciones de rendimiento entre listas basadas en el cambio de tamaño de matrices (también conocidos como vectores) frente a listas vinculadas. Y entre mapas / conjuntos basados ​​en tablas hash vs. árboles.

Muchos cálculos rutinarios se reducen a una combinación de filtro, plegado, mapa y establecer diferencia / intersección / unión, por lo que debe saber cómo hacerlos de manera concisa y eficiente con el código de la biblioteca.

Probablemente debería saber que el algoritmo de ordenación de su biblioteca es O (n log n), que es significativamente más rápido que un bucle anidado O (n ^ 2), y cómo usarlo para sacar ventaja. Esto surge de vez en cuando, pero con menos frecuencia que la estructura de datos y las operaciones establecidas anteriormente.

Si comprende los conceptos y la terminología de los patrones de algoritmos, como la fuerza bruta, dividir y conquistar, métodos ambiciosos, aleatorización y programación dinámica, podrá encontrar y digerir nuevos algoritmos según sea necesario. Apuesto a que esto será más útil que memorizar muchos algoritmos específicos.

Si desea un amplio conocimiento de los algoritmos canónicos y las estructuras de datos en informática, hágalo y lea CLRS de principio a fin. 🙂

10! En el mundo competitivo actual, esta pregunta debería renombrarse a 100 algoritmos imprescindibles. Aún así, intentemos categorizar los algoritmos en 10 categorías amplias.

Pero primero, aprender un subconjunto tan pequeño (¡solo 10!) No servirá de nada. Cuanto más aprendas, más destacarás de la multitud. Los algoritmos de aprendizaje y visualización cambiarán la forma en que abordas la situación de la vida real, siempre comenzarás a buscar una forma optimizada de hacer las cosas. Y eso es genial, eso es lo que son las personas inteligentes: perezoso, sí, siempre intentan hacer más trabajo con un mínimo esfuerzo y eso es optimización.
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.

Volviendo a categorizar algoritmos en 10 categorías amplias … uf … ahora esto llevará tiempo.

1: Algoritmos de clasificación
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)

2: 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)

3: Algoritmos en matrices
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 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)

5: Algoritmos en los á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).

7: 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).

8: Algoritmos en gráficos
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).

10: 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 mina de oro (problema de mina de oro)

¿Alguien notó que algo andaba mal? Resultó que 7 categorías funcionarán por ahora (¡considerando que comenzamos con solo 10 algoritmos!)

El algoritmo de Amazon A9

“Amazon es un ejemplo fantástico de incorporar algoritmos muy sofisticados de ejecución de máquinas diseñados para administrar el comportamiento general del grupo de personas que visitan ese sitio web”. ~ Jerry Kaplan

Según Jerry Kaplan, el algoritmo Amazon A9 explota el hecho de que saben mucho más sobre los patrones de compra que el consumidor promedio, y ese tipo de asimetría de información es el verdadero meollo de su plan de negocios. Al igual que con Google, el A9 trabaja para encontrar las páginas correctas utilizando datos específicos dentro y fuera de la página para construir los SERP. La definición de éxito del A9 es: ‘encontrar el producto que proporcionará la mejor conversión de ventas / beneficio’. El algoritmo de aumento de precios de Uber opera de alguna manera con principios similares.

Nadie puede mirar bajo el capó del A9, pero se especula que los principios de ‘agente predecible’ podrían emplearse en las máquinas inteligentes que están programadas para lograr un resultado perseguido a través del autoaprendizaje y la experimentación. A diferencia de los algoritmos de Netflix: humanos, SVD y RBM (30% de decisión humana y 70% de máquina … pero el elemento humano se valora más), Amazon parece confiar en el algoritmo de la máquina. Sabemos que el A9 está particularmente interesado en las “ventas recientes” de un producto (en lugar de las ventas de por vida). Además, A9 analiza tanto la tasa de clics (CTR) como las ventas de clics (CTS). Machine Learning está muy implementado en Amazon:

  • Para la clasificación binaria, Amazon utiliza regresión logística (función de pérdida logística + SGD).
  • Para la clasificación multiclase, Amazon utiliza regresión logística multinomial (pérdida logística multinomial + SGD).
  • Para la regresión, Amazon usa regresión lineal (función de pérdida al cuadrado + SGD).

Historial de navegación

La mayoría de los sitios web rastrean nuestro comportamiento y al hacerlo presentan productos e información basados ​​en nuestro historial de navegación. Esto es conveniente para el consumidor, pero Amazon también agrega lo que los consumidores podrían estar dispuestos a pagar por un producto (agente predecible). De hecho, los mejores algoritmos de máquina pueden determinar cuándo cobrarle a alguien más por un producto (que al siguiente tipo).

Amazon es el ejemplo perfecto de este algoritmo de máquina ‘mágico’. Sus análisis de algoritmos; hora del día, lo que compró en el pasado, cómo responde a los incentivos, de dónde es (fuente), su navegador, etc., etc. para que puedan comprarlo al precio más alto posible. Como consumidor en Amazon, usted se adhiere a propiedades estadísticas muy específicas.

Algoritmo de aprendizaje automático gigante

El mayor problema de Amazon es que quiere que las personas sigan comprando después de comprar lo que vinieron a comprar, a pesar de que no necesitan la gran mayoría de lo que vende Amazon. El algoritmo gigante está diseñado para arbitrar lo que paga por un producto y lo que vende ese producto a los consumidores. El algoritmo ajusta las ganancias dentro de una zona que nunca antes se pudo lograr en el mercado minorista.

Amazon también creó un índice de artículos que los clientes tienden a comprar juntos. Cuando alguien ve una página o realiza una compra, el sitio le muestra productos con altas calificaciones y cualidades similares basadas en ese índice “filtro colaborativo de artículo a artículo”. El proceso es súper rápido y escalable. Por lo tanto, el motor de recomendación también se basa en productos, no solo en personas.

“La próxima vez que detecte un cambio de precio para un producto que ha estado vigilando, recuerde que un sistema informático hiperinteligente lo ha estado vigilando durante tanto tiempo y es más inteligente de lo que cree”.

Mira a Jerry Kaplan discutir: El algoritmo de Amazon

———————————————————————————–

El autor ha curado este video y no tiene afiliación con Amazon o Jerry Kaplan

Algunos de los algoritmos que sugeriría en la Etapa 2 o la Etapa 3 de su Carrera de Ingeniería.

1. K – Significa

¿Qué hace? k-means crea grupos a partir de un conjunto de objetos para que los miembros de un grupo sean más similares. Es una técnica popular de análisis de conglomerados para explorar un conjunto de datos.

2. El algoritmo Apriori.

¿Qué hace? El algoritmo Apriori aprende las reglas de asociación y se aplica a una base de datos que contiene una gran cantidad de transacciones. El aprendizaje de reglas de asociación es una técnica de minería de datos para aprender correlaciones y relaciones entre variables en una base de datos.

3. C4.5

¿Qué hace? C4.5 construye un clasificador en forma de árbol de decisión. Para hacer esto, C4.5 recibe un conjunto de datos que representan cosas que ya están clasificadas. Un clasificador es una herramienta en la minería de datos que toma un montón de datos que representan cosas que queremos clasificar e intenta predecir a qué clase pertenecen los nuevos datos.

4. Máquinas de vectores de soporte

¿Qué hace? La máquina de vectores de soporte (SVM) aprende un hiperplano para clasificar los datos en 2 clases. En un nivel superior, SVM realiza una tarea similar como C4.5, excepto que SVM no utiliza árboles de decisión en absoluto.

5. Bayes ingenuos

¿Qué hace? Naive Bayes no es un algoritmo único, sino una familia de algoritmos de clasificación que comparten una suposición común: cada característica de los datos que se clasifican es independiente de todas las demás características dada la clase. Las características son independientes cuando el valor de una característica no tiene efecto en El valor de otra característica.

6. kNN

¿Qué hace? kNN, o k-vecinos más cercanos, es un algoritmo de clasificación. Sin embargo, difiere de los clasificadores descritos anteriormente porque es un estudiante perezoso. Un alumno perezoso no hace mucho durante el proceso de capacitación aparte de almacenar los datos de capacitación. Solo cuando se ingresan nuevos datos sin etiquetar, este tipo de alumno busca clasificar.

7. EM

¿Qué hace? En la minería de datos, la maximización de expectativas (EM) generalmente se usa como un algoritmo de agrupamiento (como k-means) para el descubrimiento de conocimiento. En estadística, el algoritmo EM itera y optimiza la probabilidad de ver datos observados mientras estima los parámetros de un modelo estadístico con variables no observadas.

8. PageRank

¿Qué hace? PageRank es un algoritmo de análisis de enlaces diseñado para determinar la importancia relativa de algunos objetos vinculados dentro de una red de objetos.

9. AdaBoost

¿Qué hace? AdaBoost es un algoritmo de refuerzo que construye un clasificador. Como probablemente recuerde, un clasificador toma una gran cantidad de datos e intenta predecir o clasificar a qué clase pertenece un nuevo elemento de datos.

10. CARRITO

¿Qué hace? CART significa árboles de clasificación y regresión. Es una técnica de aprendizaje de árbol de decisión que genera árboles de clasificación o regresión. Al igual que C4.5, CART es un clasificador.

Fuente: Los 10 mejores algoritmos de minería de datos en inglés simple

PD: el algoritmo se puede implementar en la estructura de datos que elija

Algoritmos , en ningún orden en particular.

  • Búsqueda de profundidad primero
  • Breadth-First Search.
  • Algoritmo de codificación de Huffman
  • Kruskal, Algoritmo Prim (árbol de expansión mínimo)
  • Algoritmo de Dijkstra (Encontrar el camino más corto)
  • Programación dinámica y algoritmos codiciosos
  • Algoritmos de comparación de cadenas
  • Algoritmos de clasificación: clasificación rápida, combinación de clasificación, selección, clasificación, burbuja.
  • Algoritmos de búsqueda: búsqueda binaria, lineal y hash.

Estructuras de datos

  • Pila y colas: cola prioritaria.
  • Lista vinculada: los cuatro tipos. (Individual, Doble, Circular, Doble Circular).
  • Árboles: Árbol AVL, Árbol 2 – 3, Árbol binario, Árbol rojo-negro.
  • Grafico
  • Formación

El mejor libro para todos los algoritmos mencionados es -Introducción a los algoritmos por Thomas H. Cormen. Compartir el enlace, Introducción a los algoritmos, 3a edición: 9780262033848: Computer Science Books @ Amazon.com.

Matriz dinámica, lista vinculada, pila, cola, búsqueda binaria, árbol de búsqueda binaria (con sus cuatro recorridos), mapa hash, primera búsqueda en profundidad, primera búsqueda en amplitud y clasificación por fusión.

Esos son los 10 más básicos que se me ocurren. Un programador que realmente entiende esto puede derivar una multitud de otros algoritmos y estructuras de datos, ya sea componiéndolos o explotando el mecanismo que los hace funcionar.

Supongo que un número arbitrario, como 10, es solo una guía. Por esta razón, también agregaré a la mezcla: clasificación de montón (principalmente debido a su montón binario), coincidencia de cadena Rabin-Karp (principalmente debido a la técnica de hash rodante), clasificación de introducción (como modelo para algoritmos híbridos y transacciones con debilidades), selección rápida (como modelo para la explotación no obvia de la técnica de “descartar parte de la entrada” de la búsqueda binaria, así como su aplicación natural), eliminación condicional (debido al uso inteligente de punteros de lectura / escritura : http://en.cppreference.com/w/cpp …, http://en.cppreference.com/w/cpp …, http://mjuchem.com/iterating-and …), árbol de prefijos (ambos para su búsqueda eficiente y facilidad de particionamiento), lista de omisión (debido a la idea de indexar en cada n elementos e indexación multinivel), b-tree (como modelo para estructuras de datos híbridas y cómo mejorar la localidad de referencia) y submatriz máxima sum (también conocido como Kadane 2D, debido a su truco con sumas en ejecución).

Esta nueva lista es más grande que 10 pero sigue siendo bastante pequeña. Además, cubre un repertorio de técnicas impresionantemente grande.

No te limites a solo aprender los algoritmos. Concéntrese en sus invariantes, fortalezas, debilidades, posibles optimizaciones (tiempo y espacio), variaciones (y especializaciones), y lo más importante: entienda cuál es la idea clave que los hace funcionar.

Estos no están realmente en un orden específico, tal como aparecen en mi cabeza.

Algoritmos

  • Quicksort de 3 vías (clasificación estándar de uso general)
  • Clasificación de combinación (una clasificación más escalable con una complejidad asintótica similar a la clasificación rápida)
  • Búsquedas de DF / BF (particularmente sabiendo cuál aplicar)
  • Prim’s / Kruskal’s (árbol de expansión mínimo)
  • Dijkstra’s (camino más corto)
  • Algoritmo de selección

Estructura de datos

  • Mapas de hash (sabe todo sobre hashing, de verdad)
  • Gráficos y árboles (los árboles rojo-negros son buenos para aprender)
  • Montones (colas de prioridad)
  • Colas y pilas (bloques de construcción básicos reales que debe conocer de adelante hacia atrás)
  • Intentos (un poco específico, pero muy útil en el escenario correcto)

Los algoritmos genéticos A * y también son heurísticas divertidas para conocer.

Algoritmos

  1. Búsqueda de gráficos ( BFS , DFS ): DFS es especialmente importante ya que proporciona más información estructural sobre el gráfico de lo que uno pensaría inicialmente
  2. Clasificación ( Clasificaciones de comparación y esquemas de agrupación)
  3. El método general de programación dinámica.
  4. Algoritmos de coincidencia y flujos de red
  5. Expresiones regulares y coincidencia de cadenas

Estructuras de datos

  1. Gráficos : los árboles son especialmente importantes
  2. Mapas
  3. Muchísimo
  4. Pilas / Colas
  5. Intentos

Los extras incluyen
– Algoritmos codiciosos
– Métodos probabilísticos
– Algoritmos de aproximación

Todo ingeniero de software debería leer el libro Kernighan y Ritchie C. No solo es importante aprender la sintaxis de un lenguaje históricamente importante como el C (del cual muchos otros lenguajes de procedimiento, a su vez, toman prestada su sintaxis), sino que el libro también es una introducción a algoritmos esenciales y estructuras de datos introducidas en el contexto de aprender C y de implementar estos algoritmos y estructuras de datos en C. Cubrirás estructuras de datos como listas de enlaces, tablas hash, árboles B, matrices, estructuras y pilas. También cubrirá algunos algoritmos de clasificación y hash, y técnicas como la recursividad. Finalmente, obtendrá un tratamiento exhaustivo de la administración de la memoria a través de la manipulación del puntero y la asignación dinámica de la memoria. Creo que es una lista de diez elementos en total, siendo los dos últimos elementos técnicas de programación comunes.

Dependiendo del propósito de la aplicación y la cantidad de datos, es posible hacer una primera clasificación de la siguiente manera.

  1. Agrupación : es el problema de agrupar a los individuos de una población por su similitud de atributos. Un algoritmo de agrupamiento muy famoso es, por ejemplo, k-means. Aquí hay una presentación ppt en slideshare de cómo funcionan los kmeans: Presentación de algoritmos
  2. Algoritmos de clasificación. La clasificación intenta predecir, para cada individuo en una población, a qué conjunto de clases pertenece este individuo. Una tarea de clasificación, dada una nueva persona, determina a qué clase pertenece esa persona. También puede asignar una probabilidad a esta asociación. Un ejemplo es KNN (o k neares vecino)
  3. Algoritmo de reducción de dimensiones para reducir las dimensiones de un conjunto de datos. Intenta tomar un gran conjunto de datos y reemplazarlo con un conjunto de datos más pequeño que contenga gran parte de la información importante en el conjunto más grande. Por ejemplo, puede usar el conjunto de datos reducido para entenderlo mejor y visualizarlo en dimensiones 2D.
  4. PCA o análisis de componentes principales para identificar las variables más importantes en su conjunto de datos. Existen muchos estudios que utilizan PCA para el análisis de datos, pero este es uno de los documentos que lo aplica de manera original: Comportamientos propios: identificación de la estructura en la rutina.
  5. Filtrado colaborativo para construir sistemas de recomendación. Es un problema de similitud coincidente. Por ejemplo, encontrar personas que son similares a usted en términos de los productos que les han gustado o que han comprado o encontrar productos que son similares con respecto al conjunto de atributos. En este último caso, se realiza un algoritmo de recomendación “basado en elementos”
  6. Reglas de asociación o agrupación conjunta para el análisis de la cesta de la compra. Una pregunta común en este caso es: ¿qué artículos se compran comúnmente juntos? Por ejemplo, analizar los registros de compra de un supermercado puede descubrir que la cerveza se compra junto con papas fritas con frecuencia.
  7. Método de regresión para predecir el valor de un cierto valor . Por ejemplo: ¿Cuánto usará un cliente determinado un determinado servicio? La cantidad que se va a predecir aquí es el uso del servicio, y se podría generar un modelo observando a otras personas similares de la población y su uso histórico.
  8. Algoritmo LDA para análisis de sentimientos y minería de texto, pero también para muchas otras aplicaciones. Aquí un artículo al respecto: Página en aaai.org
  9. El camino más corto de Dijkstra para encontrar el camino más corto de un nodo a otro en un gráfico. Probablemente el algoritmo más importante en la teoría de grafos.
  10. Predicción de enlaces para predecir conexiones entre elementos de datos, sugiriendo que debe existir un enlace y estimando la fuerza del enlace. Por ejemplo, en las redes sociales trata de adivinar si usted y John comparten 15 amigos, tal vez usted y John podrían ser amigos en la vida real.

En cuanto a las estructuras de datos, debe estar familiarizado con las listas y las listas enlazadas, los mapas de árbol HashMaps, los conjuntos y todas las diferentes versiones. Aquí se puede encontrar un buen libro para algoritmos y estructuras de datos en Java: estructuras de datos y algoritmos en Java, 6ta edición y estructuras y algoritmos de datos de Python en Python

Buena suerte.

Karim Naggar ofrece una excelente lista de estructuras de datos y algoritmos, pero diría que no necesita conocer la mayoría de ellos. Más bien, tenga en cuenta que existen y más o menos para qué están destinados. Entonces ve a aprenderlos si los necesitas. Lo digo como ingeniero de software de alto nivel y doctor en informática.

Lo mejor que puede hacer es familiarizarse con las matrices, las listas, las tablas hash, la ordenación y la búsqueda / selección. Si eres un programador de C ++, mira el STL y sus plantillas más populares. Hay análogos para Java, etc.

Una vez más, no es necesario que comprenda estos algoritmos y estructuras de datos en profundidad, simplemente conozca sus características.

Si tuviera que implementar las estructuras de datos y algoritmos desde cero, diría:
matrices, listas sin clasificar, mapas, especialmente tablas hash, árboles binarios e intentos.
Para algoritmos: clasificación rápida, clasificación de burbujas, clasificación de inserción, búsqueda binaria.

Estoy seguro de que hay más, pero hay un mar bastante grande por ahí. Lo mejor es concentrarse en familiarizarse con las partes que sabe con certeza que va a nadar.

¿Que tan larga es una pieza de cordon?

Clasificación: clasificación rápida y burbuja. Quicksort es una clase infinitamente mejor, pero descubrir por qué funciona la clasificación de burbujas te enseñará muchas cosas.

Yourdon loops, porque los usarás * todo * todo el tiempo.

Todas tus reglas booleanas. Seriamente. Saber cómo los nots interactúan con ors y ands, etc., le ahorrará * infinitas * cantidades de sufrimiento de código. ¡Esto no es opcional!

* Todas * las reglas de normalización, y cómo funcionan las uniones internas y externas, etc. A pesar de lo que puedan pensar los hipsters, los sistemas RDBMS no van a ninguna parte, porque el 99% de las veces, siguen siendo la mejor solución. No piense que puede MongoDB sin saber cómo organizar una unión SQL bien diseñada. No es una suposición del mundo real.

Aquí hay una lista de estructuras de datos comunes

  1. Estructura de datos de matriz y matriz dispersa
  2. Lista vinculada y lista doblemente vinculada
  3. Pila (tipo de datos abstractos) y Cola (tipo de datos abstractos)
    y cola de doble final
  4. Árbol binario y Treap
  5. Árbol rojo-negro
  6. Montón (estructura de datos)
  7. Cadena (informática) y Trie
  8. Árbol B y árbol B +
  9. Gráfico (tipo de datos abstractos)
  10. Tabla hash y matriz asociativa

Para la mayoría de la estructura de datos, debe aprender a realizar operaciones de inserción, eliminación, recorrido, unión, búsqueda y cambio de tamaño. Tenga en cuenta que algunas estructuras de datos tienen operaciones muy específicas.

Una lista de algoritmos comunes

  1. Búsqueda lineal
  2. Algoritmo de búsqueda binaria y búsqueda ternaria
  3. Algoritmo de fusión y clasificación de fusión
  4. Tipo de inserción y Timsort
  5. Heapsort y Quicksort
  6. Algoritmo de selección
  7. Recorrido del gráfico (DFS, BFS)
  8. Algoritmo de Dijkstra y algoritmo de Bellman-Ford
  9. Clasificación topológica
  10. Estructura de datos de conjunto disjunto (búsqueda de unión) y árbol de expansión mínima
  11. Algoritmos de red de flujo

Y mucho más, seguiré agregando como recuerdo.

¿Algoritmos y estructuras de datos más conocidos? Hmmm

  1. Apilar
  2. Queue / Dequeue
  3. Cola priorizada
  4. Lista enlazada
  5. Tampón de ping-pong
  6. Anillo de amortiguación
  7. Árbol binario
  8. Árbol rojo-negro
  9. N-ary Tree
  10. Gráficos
  11. Expresiones regulares
  12. Códigos grises
  13. Conjuntos
  14. Álgebra Matriz
  15. Transforma
  16. Ordenar

Eso es 10 (en hexadecimal) algoritmos y tipos de datos.

Ok, hice un poco de trampa en las transformaciones y ordenar. Especificaré algunos ejemplos de formas muy comunes de estos:

  1. Transformada rápida de Fourier
  2. Proyección Isométrica
  3. Rotar / Escalar / Mover un punto en algún espacio (lo estoy definiendo como un algoritmo ya que pueden implementarse como una operación de matriz única)
  4. Clave hash
  5. Tamizar Ordenar
  6. Ordenación rápida
  7. Clasificación de árbol (aunque, posiblemente, si tiene un árbol binario, entonces ya tiene una clasificación de árbol)

Esta no es la lista definitiva absoluta de todas las transformaciones y tipos utilizados. Todos los códecs son transformaciones, al igual que todos los códigos de corrección de errores, todas las formas de cifrado, todas las operaciones de hash (criptográfico, compactación, lo que sea). Luego están las transformaciones regulares de Fourier, las transformaciones Z y muchas otras.

Las transformaciones son una forma de convertir un problema que no puede manejar directamente en uno que sí puede. Si puede volver a transformarlo depende del método utilizado.

La razón para tener una selección completa de tipos es que diferentes tipos de lista tienen diferentes propiedades en términos de espacio, tiempo y aleatoriedad inicial. Si sabe, de hecho, que la lista es principalmente para comenzar, entonces la capacidad del algoritmo para atravesar una lista totalmente desordenada no importa. Si está trabajando con un pequeño microcontrolador, está trabajando con un pequeño conjunto de datos y tiene que escribir su código para que quepa en un pequeño espacio. Todo es un acto de equilibrio.

1. Matrices

  • Sepa cómo usar matrices. Los usarás mucho.
  • Aprenda cómo hacerlos crecer dinámicamente (para lenguajes de programación como C).
  • Saber cómo usar una matriz de biblioteca estándar (ejemplo: vector)
  • Aprenda a usar cadenas (son matrices).
  • Sepa cómo ordenarlos con dos buenos algoritmos de clasificación ( QuickSort y MergeSort )
  • Aprende a buscar en una matriz. Primero búsqueda lineal y luego búsqueda binaria .
  • Aprenda QuickSelect , será útil.

2. Listas vinculadas

  • Aprenda a crear una lista vinculada.
  • Conozca las operaciones básicas: insertar, imprimir, eliminar.
  • No usará mucho las listas enlazadas en la palabra real, pero tener una sólida comprensión de cómo funcionan será de gran utilidad.
  • Conozca diferentes versiones de listas enlazadas: circular y doble, por ejemplo.
  • Conozca las ventajas de una lista vinculada frente a una matriz

3-4. Pilas y colas

  • Aprenda a implementar pilas y colas con matrices y listas. Conoce las ventajas.
  • Para las pilas, aprenda la conversión y evaluación de postfix. Aprenda también la combinación de paréntesis. Esto te ayudará a dominar las pilas.
  • Para las colas, debe intentar hacer una programación multihilo.

5. árboles

  • Si hiciste un trabajo adecuado con listas vinculadas, los árboles deberían sentirse un poco naturales.
  • Aprenda a implementar un árbol binario (insertar, eliminar, buscar).
  • Conoce las propiedades básicas de un árbol.
  • Aprenda al menos un árbol de equilibrio automático ( AVL, Splay, Rojo-Negro ).
  • Me gusta mucho la estructura de datos de Trie . Tiene algunas aplicaciones bastante buenas.
  • Otra estructura de datos que se usa mucho es el montón .
  • Aprenda Breadth First Search y Depth First Search .

6. Hashmap

  • Hashmap es una estructura de datos realmente útil.
  • Aprenda cómo usarlos y cómo implementar uno (así que aprenda cómo hacer una función de hash ordenada).

7. Gráficos

  • Aprenda qué es un gráfico y cómo implementarlos con matrices y listas.
  • Aprenda cómo usarlos y cómo implementar uno (así que aprenda cómo hacer una función de hash ordenada).
  • Aprende a encontrar la ruta más corta en un gráfico.
  • Implementar DFS y BFS.

8-10. Algoritmos

  • Como mencioné antes, aprenda los algoritmos de clasificación y búsqueda.
  • Aprende la notación Big O.
  • Buscar: MergeSort, QuickSort, HeapSort .
  • Diskstra . No usará esto, pero le dará una mejor comprensión de los gráficos.
  • Hay otros buenos algoritmos que quizás quieras aprender. Algunos son algoritmos de libros de texto (cadena inversa, subcadena, etc.).

Espero que esto ayude.

Algunas fuentes que podrías usar:

Debe conocer las estructuras de datos:

1. Cuerdas

2. Matrices

3. Listas vinculadas

4. Pilas

5. Árboles – Árbol binario, BST, Árbol AVL, Trie

6. Gráficos

7. Montones

8. Hash

Debe conocer al menos estas estructuras de datos si es ingeniero de software.

Es difícil enumerar solo 10 algoritmos que todo ingeniero de software debe conocer, pero puede pasar por estos enlaces que tienen algoritmos que todos los ingenieros de software deben conocer:

Matrices – YouTube

Recursión – YouTube

Problemas de búsqueda binaria

Listas vinculadas – YouTube

Árboles – YouTube

Programación dinámica

Gráfico: YouTube

Pila – YouTube

Instrumentos de cuerda

También puede consultar estos algoritmos aquí: IDeserve: plataforma de aprendizaje única para mejorar las habilidades algorítmicas.

Matrices

Lista enlazada

Arboles

Instrumentos de cuerda

Grafico

Programación dinámica

Espero que esto ayude.

Solía ​​tener un profesor (Dr. Marvin Solomon en U. Wisconsin, Madison), quien dijo: todos los problemas en ciencias de la computación pueden resolverse usando hashing e indirección. Continuó diciendo que la indirección generalmente conduce a una reducción en el rendimiento, que se puede manejar mediante el almacenamiento en caché.

Creo que hay un grano de verdad en esto.

Me encantan los algoritmos y las estructuras de datos y he aprendido mucho sobre muchos de ellos (tengo una licenciatura, maestría y doctorado en CS); pero en más de 12 años de programación de la vida real, rara vez he tenido que usar mucho más que tablas de hash, y clasificación, y ocasionalmente árboles. Tal vez una vez cada 2 o 3 años se presente la oportunidad de utilizar una estructura / algoritmo de datos sofisticado, pero el resto del tiempo es solo el hash y la clasificación. (Por supuesto, no estoy hablando de todas las estructuras de datos que termino usando cuando uso una biblioteca estándar o alguna aplicación (como B-Trees utilizados por los índices en una base de datos)).