¿Cuáles son las aplicaciones prácticas de los diversos algoritmos que estudian los estudiantes de CS en Data Structures?

Estructuras de datos y algoritmos es uno de los temas más importantes. Otros incluyen: Diseño y análisis de algoritmos, lenguajes de programación, sistemas operativos, matemática discreta y álgebra lineal.

Desde entonces, trabajo en el campo de los sistemas operativos y compiladores. Le mostraré la importancia de las estructuras de datos y los algoritmos utilizando algunos ejemplos del mundo real de proyectos populares de código abierto como Linux Kernel, GNU C Compiler, etc.

  • Procesos en el kernel de Linux: un ejemplo muy simple (pero muy importante en términos de rendimiento y seguridad) para mostrar la relevancia de las matrices y los diferentes tipos de listas vinculadas en el kernel de Linux. Supongamos que está diseñando un sistema operativo y desea mantener la colección de procesos actualmente en ejecución o en espera. ¿Cómo guardas esa colección? Hay dos maneras:
    • Asigne una matriz de punteros y establezca el elemento de cada matriz en el puntero a un objeto de proceso. ¿Suena bien verdad? Pero, ¿puede la matriz crecer dinámicamente? No. Entonces, puede usar el concepto de vector en C ++, es decir, primero asignar una matriz de tamaño fijo, luego crecer 2 veces cada vez que la matriz se llena. Parece bueno ¿verdad?
      Pero, aquí hay dos problemas: (i) cada vez que reasigne la matriz, debe copiar todos los elementos de la matriz previamente asignada a una nueva matriz, y (ii) tomar el punto cuando ha crecido la matriz dos veces, casi la mitad de el espacio recién asignado está vacío, lo que puede usarse para otros fines. Por lo tanto, el punto (i) usa ciclos adicionales y el punto (ii) usa memoria adicional, cualquiera de los cuales no está disponible para un Kernel.
    • Ahora veamos los requisitos de la colección de procesos: (i) ¿dónde vamos a insertar un proceso recién creado en la colección? al final de la lista porque solo necesitamos una colección de todos los procesos; (ii) ¿necesitamos acceder a un proceso en un índice específico? No, solo necesitamos acceder al primer objeto de la lista y mantener la lista; (iii) queremos que se elimine un proceso en O (1) no en O (N). Entonces, ¿qué estructura de datos podemos usar con las condiciones anteriores? Una lista parece ser una mejor opción. Porque, no está tomando memoria adicional (de acuerdo, hay un puntero de 4 bytes (u 8 bytes), pero cuando se compara con el espacio adicional del vector, todavía es menor), y no hay cálculos adicionales. Entonces, una Lista es una mejor opción. Pero, para eliminar un elemento de una lista, necesitamos tener un puntero al elemento anterior. Entonces, incluso en la lista, la eliminación sería O (N), no O (1).
    • Podemos usar la Lista Doblemente Vinculada para resolver el problema anterior, la eliminación es O (1) y no se desperdician ciclos de CPU adicionales. Recuerde que una Lista Doblemente Vinculada tiene una cabeza y una cola, y para insertar en la cabeza / cola, necesitamos realizar una comprobación de puntero NULL (recuerde, un nodo es una cola si el siguiente elemento en la lista es un puntero NULL). Espero que sepas lo que podría pasar si un puntero NULL es desreferenciado (Respuesta: Falla de segmentación o podría ser explotado por un atacante). Pero en una Lista Circular Doblemente Vinculada no hay cabeza ni cola, por lo tanto, se usa para eliminar el dolor de la comprobación de puntero NULL. Esto no solo aumentó la robustez del código escrito en Linux Kernel sino también la seguridad.
  • El ejemplo anterior muestra cómo el Kernel de Linux realiza un seguimiento de todos los procesos. El kernel de Linux no utiliza un programador Round Robin, sino que utiliza un programador completamente justo (CFS). Este planificador funciona asignando una métrica a cada proceso, que se basa en el tiempo que ha pasado en ejecución y espera. CFS ejecuta un proceso que tiene el valor mínimo (o máximo, depende de cómo implemente esa métrica) de esta métrica. Entonces, ¿cómo se asegura de obtener el valor mínimo de la métrica en el menor tiempo posible? La respuesta es un árbol binario equilibrado. ¿Pero cual? AVL o Red Black Tree? Linux Kernel usa un Red Black Tree porque es más rápido que AVL (aunque la complejidad de cada operación es la misma, pero más rápido aquí significa, una implementación rápida y el Red Black Tree atraviesa el árbol solo una vez en la inserción o eliminación, mientras que AVL puede hacerlo 2 veces). También podemos usar Heap en este caso, pero Linux Kernel usa esta estructura de árbol para otras cosas también, lo que Heap no puede hacer de manera eficiente.
  • La tabla de símbolos en GCC (o cualquier compilador) almacena el tipo de símbolo (nombre de variable, nombre de clase, etc.). Hay varias formas de implementar una tabla de símbolos y la forma ingenua sería crear dos matrices: s ymbol_array y type_array . Para cada índice i , type_array [ i ] representa el tipo del símbolo en symbol_array [ i ]. Esta implementación ingenua es demasiado lenta, porque busca en O (N), lo que definitivamente puede mejorarse. Una forma simple y más efectiva es usar una tabla hash, que puede devolver el tipo de un símbolo básicamente en el tiempo O (1).

Entonces, puede ver por qué es tan importante estudiar estructuras de datos y algoritmos. No creo que una persona deba estar haciendo programación competitiva todo el día para comprender qué DS y Algos usar en qué lugar. Pero esto también puede entenderse participando en el desarrollo de software y aprendiendo sobre prácticas populares de diseño de software.

A2A

La lista de algoritmos está aquí: Lista de algoritmos – Wikipedia

Las categorías en las que se enumeran, como Bioinformática, Teoría de la información y procesamiento de señales, Algoritmos de sistemas operativos, etc., harían alusión a sus aplicaciones prácticas. Leer todo el tema le dará su uso exacto.

Tenemos recursos limitados en todas partes, como el agua potable es limitada, solo el 2.5% de toda el agua en la Tierra es agua dulce, solo el 0.3% del agua dulce del planeta está fácilmente disponible como agua superficial en lagos, pantanos, ríos y arroyos

Del mismo modo, su computadora tiene memoria RAM fija, CPU, E / S de red, E / S de disco, etc. más allá de sus umbrales, no pueden funcionar o se rompen, de manera similar su teléfono móvil (cliente) o el yahoo (servidor) tienen limitaciones.

La selección y el uso eficiente de estructuras de datos y algoritmos, dará como resultado un uso óptimo de estos recursos limitados y le dará el resultado que busca para hacer algo en el intervalo más corto posible.

Por otro lado, si tienes suerte obtendrás el mismo resultado, pero no siempre tenemos suerte, así que los aprendemos, su efecto secundario es un mejor salario en el trabajo.

1. Los procesos del núcleo emplean estructuras de datos.

2. Sistema de archivos es una aplicación importante de algoritmos de estructura de datos (B + Tree utilizado en NTFS)

3.Los algoritmos de asignación de memoria utilizan la estructura de datos de la lista vinculada para su funcionamiento (Buddy Allocator / Slab allocator)

4. La programación de procesos emplea en gran medida algoritmos en su funcionamiento. por ejemplo, CFS Scheduler, O (1) Scheduler.

5. Los cálculos matemáticos a menudo usan pilas y colas.

6. Cuando se llama a una función en un programa, se crea un registro de activación de función en la pila.

7. Trabajo de subrutinas (cuando la PC en el procesador encuentra instrucciones de Llamada y Devolución. Esto implica el uso de Stack

a) Para almacenar un conjunto de programas a los que se les dará acceso a un disco duro de acuerdo con su prioridad.
b) Para representar una red telefónica regional de la ciudad.
c) Almacenar un conjunto de palabras clave fijas a las que se hace referencia con mucha frecuencia.
d) Representar una imagen en forma de mapa de bits.
e) Implementar la funcionalidad de respaldo en el navegador de internet.
f) Almacenar datos de crecimiento dinámico a los que se accede con mucha frecuencia, en función de un valor clave.
g) Implementar la cola de impresión para que los trabajos se puedan imprimir en el orden de llegada.
h) Grabar la secuencia de todas las páginas navegadas en una sesión.
i) Implementar la función de deshacer en un editor de texto.
j) Almacenar información sobre los directorios y archivos en un sistema.

Fuente: http://www.grantmoneyadvisor.com

More Interesting

¿Es una mala idea usar Python para aprender algoritmos y programación competitiva?

Cómo calcular óptimamente grandes factoriales de orden 10 ^ 5 para operaciones repetidas (por ejemplo, encontrar permutaciones)

¿Cuál es el tipo de algoritmo utilizado para resolver el problema de 8 reinas?

¿Cuáles son algunos de los algoritmos / estructuras de datos que son útiles en la vida real?

¿Alguien puede enumerar las dosis de azufre homeopáticas en orden ascendente?

¿Por qué prácticamente todos los algoritmos de ascensor son tan ineficientes y cuáles son las razones por las que aún no se han optimizado?

¿Cuánto tiempo / horas debo pasar todos los días para ser un buen programador de Java para poder resolver estructuras de datos y algoritmos con ese lenguaje en el futuro?

¿Cuál es la mejor manera de extrapolar una señal dispersa que proviene de un filtro de Kalman?

¿Dónde puedo encontrar un entrenador de programación personal que me enseñe programación y algoritmos?

Al modelar un autómata determinista de estado finito, ¿qué algoritmo de recorrido gráfico debe usarse?

¿Qué significa front = rear = null y front = rear = -1 en la cola de las estructuras de datos en C ++?

¿Cuál es una explicación simple del algoritmo del modelo oculto de Markov?

¿Cómo podemos transferir datos digitales binarios a un canal físico?

¿Cuál: Estructura de datos y pensamiento algorítmico con Python (Narasimha Karumanchi) o Estructuras de datos y algoritmos en Python (Michael T. Goodrich)?

¿Me pueden ayudar a aprender estructuras de datos y algoritmos?