¿En qué áreas de la programación el tiempo de ejecución del algoritmo es realmente un tema importante?

15

Algunas veces escucho a la gente decir que debido a la velocidad de los procesadores y la cantidad de memoria disponible, la eficiencia del algoritmo y el tiempo de ejecución no son, en la práctica, una preocupación importante.

Pero imagino que todavía hay áreas donde tales consideraciones siguen siendo de suma importancia. Dos de los que vienen a la mente son las transacciones algorítmicas, donde miles de transacciones deben realizarse en fracciones de segundo, y la programación de sistemas integrados, donde la memoria y el poder a menudo son escasos. ¿Tengo razón acerca de estos ejemplos? ¿Y qué otras áreas también serían ejemplos?

    
pregunta cocojambles 11.02.2012 - 04:59

13 respuestas

14

La velocidad siempre está en demanda. Supongo que tienes razón. Aquí hay algunos ejemplos en los que se requieren algoritmos ordenados:

  1. Criptografía

  2. Buscando en grandes bases de datos

  3. Ordenar y fusionar

  4. Búsqueda de texto (no indexado), incluidos comodines

  5. Problemas de matemáticas con cálculos intensivos

  6. Simulación

  7. Aplicaciones de minería de datos

  8. Animación

  9. AI

  10. Visión por ordenador

respondido por el NoChance 11.02.2012 - 05:06
7

Hay algunos casos en los que el tiempo de ejecución del algoritmo puede no ser un gran problema, porque hemos llegado al punto de que simplemente puede marcar un algoritmo de ejecución más larga con un hardware más potente. Pero definitivamente hay algunos lugares donde los aceleramientos son esenciales.

En general, cualquier cosa que use conjuntos de datos enormes será un problema. Cuando tienes algo que va mal con n, y luego haces que n sea un número realmente grande, tienes un problema. Sospecho que si usted fue al sitio Beta de Computational Science y buscó un poco, podría encontrar muchos problemas que necesiten algoritmos mejores y más rápidos. Algunas áreas que me he encontrado:

  • Análisis estadístico particularmente complejo. Una combinación de algoritmos ineficientes y grandes conjuntos de datos puede significar desaceleraciones masivas. Para algunos estudios, esto podría no importar, pero ¿qué sucede si está intentando hacer algo con un cambio rápido? "Saldrá del servidor en un mes" es probablemente algo malo cuando está ejecutando un sistema de vigilancia de amenazas químicas / nucleares / biológicas.
  • Minería de datos en grandes conjuntos de datos.
  • Simulaciones que involucran muchas variables.

En términos generales, la computación científica en general parece ser un área donde la complejidad de lo que se está programando genera oportunidades para desaceleraciones graves si su algoritmo es lento (muchos de ellos sufren de n muy grandes). Y, como mencionaste, hay aplicaciones financieras. Cuando los milisegundos pueden determinar si ganas o pierdes dinero en un intercambio, los algoritmos "lo suficientemente buenos" no lo reducirán si hay algo mejor que se pueda hacer.

    
respondido por el Fomite 11.02.2012 - 05:24
4
  

A veces escucho que la gente dice que debido a la velocidad de los procesadores   y la cantidad de memoria disponible, la eficiencia del algoritmo y el tiempo de ejecución   No son, en la práctica, de mayor preocupación.

Tómalo con un grano de sal. Básicamente, una mayor potencia de cálculo significa que su n puede ser mucho más grande antes de que se ralentice significativamente. Para la mayoría de los problemas cotidianos, esta n ahora es lo suficientemente grande como para que no tenga que preocuparse. Sin embargo, aún debe conocer las complejidades de sus algoritmos.

Con más recursos disponibles, es posible que deba procesar más datos más adelante. Hoy necesita analizar un archivo de registro de 10MB con 100,000 líneas. En un año puede tener un archivo de registro de 100 GB con 1,000,000,000 de líneas. Si la cantidad de datos crece más rápido que los recursos de recursos, más tarde tendrá problemas.

Con más recursos disponibles, más capas se apilan unas sobre otras. Sistema operativo, marco de trabajo, marco de terceros, intérprete de idiomas y, finalmente, una herramienta propia. Todas las ineficiencias innecesarias en todas las capas diferentes se multiplican. Mañana su herramienta puede ejecutarse en un nuevo sistema operativo con más timbres y silbidos, que a su vez consume más ciclos y más memoria, dejando menos para usted.

Por lo tanto, para responder a su pregunta, aún debe preocuparse de dónde se deben procesar cada vez más datos (se proporcionan suficientes ejemplos en las otras respuestas) y donde no se proporciona la herramienta final, sino otra capa de abstracción para otras herramientas .

    
respondido por el Secure 11.02.2012 - 09:08
3

Hace unos años tuve que escribir un algoritmo que clasificara los tubos de ensayo dispuestos en racks n en dos particiones distintas: es decir, se eligió un subconjunto de tubos y el resto se seleccionaron 'no elegido' y el resultado final sería que ningún bastidor tendría un tubo 'elegido' y 'no elegido' (había algunos requisitos adicionales, como la compresión). Cada estante contenía un máximo de 100 tubos.

El algoritmo se usaría para conducir un robot de clasificación de tubos en un laboratorio farmacéutico.

Cuando se me asignó la especificación original, me asignaron en la región de 1 minuto de tiempo de cálculo para clasificar alrededor de 2000 tubos, ya que pensábamos que la facilidad de uso no era demasiado dolorosa. Se exigía que la cantidad de movimientos fuera mínima en todas las combinaciones posibles, ya que el robot en sí era lento .

La suposición implícita era que la complejidad sería exponencial con el número de tubos. Sin embargo, mientras trabajaba en el diseño del algoritmo, descubrí que hay un algoritmo rápido O(n) donde n es el número de racks que realizan una partición óptima de los tubos. El resultado fue que el tiempo de clasificación del algoritmo fue instantáneo, por lo que la pantalla de clasificación se actualizaría en tiempo real a medida que el usuario configuraba su operación de clasificación.

Para mí, la diferencia entre el usuario que se sentó por un minuto después de cada cambio y tener una interfaz gráfica de usuario de respuesta instantánea fue la diferencia entre una pieza de software que era funcionalmente suficiente y una pieza de software que fue un placer usar.

    
respondido por el user23157 11.02.2012 - 12:02
3

Otras áreas incluyen muchos tipos de procesamiento de señales en tiempo real, sistemas de control de retroalimentación, deconvolución de exploración petrolera, compresión de video, trazado de rayos y procesamiento de cuadros de películas, sistemas de realidad virtual, juegos donde la alta velocidad de cuadros puede ser una ventaja competitiva significativa Los teléfonos inteligentes y otras aplicaciones para dispositivos móviles, donde una gran cantidad de ciclos de CPU consumirán la vida de la batería de los usuarios más rápido.

Estoy bastante sorprendido de que esta pregunta incluso se hiciera, ya que para cualquier supercomputadora Top-500 que se haya construido, es probable que haya una lista de espera de investigadores que pueden maximizar y desear magnitudes más poder de cómputo o magnitudes mejores algoritmos para resuelva algún problema (doble alguna proteína para descifrar el cáncer, etc.) antes de que se jubilen.

    
respondido por el hotpaw2 11.02.2012 - 07:25
1

Creo que los motores de búsqueda como Google y Bing son una de las áreas más grandes donde se utilizan algoritmos complejos y desempeñan un papel clave en la aceleración de los resultados con relevancia (clasificación de página). Más utilidad para los usuarios.

    
respondido por el Karthik Sreenivasan 11.02.2012 - 05:38
1

La eficiencia de los algoritmos no es una preocupación importante en la actualidad porque estamos usando algoritmos eficientes. Si utilizara un algoritmo O (n!), Sería lento en cualquier tipo de hardware.

    
respondido por el nikie 11.02.2012 - 09:12
1

La complejidad del algoritmo es cada vez más importante a medida que aumenta la cantidad de datos. Afortunadamente, las soluciones genéricas eficientes para problemas de programación comunes (búsqueda y clasificación, principalmente) están incluidas en casi todas las bibliotecas estándar de los lenguajes de programación modernos, por lo que normalmente, un programador no tiene que preocuparse mucho por estas cosas. El inconveniente es que muchos programadores no saben en absoluto qué está pasando bajo el capó y cuáles son las características de los algoritmos que utilizan.

Esto se vuelve especialmente problemático ya que muchas aplicaciones no se someten a pruebas de estrés de manera adecuada: las personas escriben códigos que funcionan bien para pequeños conjuntos de datos de prueba, pero cuando se enfrentan a unos pocos miles de veces más datos, el código se detiene. Algo que funciona bien para diez registros explota rápidamente cuando el conjunto de datos crece. Ejemplo del mundo real: un fragmento de código que se suponía que debía limpiar los elementos que no estaban vinculados a ninguna categoría ya utilizaba un bucle anidado de tres niveles, que es O (n ^ 3). Con solo 10 registros en la base de datos de prueba, esto significó 1000 cheques, perfectamente realizables y no presenta un retraso notable. Sin embargo, la base de datos de producción se llenó rápidamente con alrededor de 1000 filas y, de repente, el código hace mil millones de cheques cada vez.

Entonces: No, no es necesario que conozca los entresijos de implementar todo tipo de algoritmos nítidos, y no necesita poder inventar los suyos, pero sí necesita un conocimiento básico de los algoritmos comunes. , cuáles son sus puntos fuertes y débiles, cuándo y cuándo no usarlos, y debe ser consciente del posible impacto de la complejidad algorítmica, para que pueda decidir qué nivel de complejidad es aceptable.

    
respondido por el tdammers 11.02.2012 - 10:54
0

No se trata de qué dominios de aplicación son sensibles al tiempo de ejecución. Cualquier programa, en cualquier lugar, tiene un rendimiento mínimo por debajo del cual no tiene ningún valor. El punto de complejidad del algoritmo es cómo varía al aumentar el tamaño de la entrada. En otras palabras, las áreas en las que la velocidad es especialmente importante son aquellas en las que espera tener que escalar más allá del tamaño del problema actual, sino también del orden de magnitud del tamaño del problema actual. Si procesa las solicitudes de impuestos de los ciudadanos de un departamento de Francia, la tarea puede ser grande, pero no es probable que el tamaño de la población o la complejidad del procesamiento de un registro aumenten diez o cien veces, por lo que cualquier cosa funciona para Usted ahora, probablemente seguirá trabajando. Pero si intenta crear algo que despegará en volúmenes de Internet, la complejidad del algoritmo es clave: cualquier cosa que dependa más que de forma lineal o log-lineal del tamaño de entrada se se volverá mucho más costosa muy rápido, y finalmente, la velocidad del procesador no puede continuar con el crecimiento.

    
respondido por el Kilian Foth 11.02.2012 - 09:10
0

En mi campo (VFX, que cubre aspectos como el trazado de rutas, la animación por computadora, la simulación de partículas, la dinámica de fluidos, el procesamiento de imágenes, etc.), la complejidad algorítmica es fundamental. No hay forma de que algo que funcione en un tiempo peor que el tiempo lineal puede esperar completar en un tiempo razonable en entradas que comúnmente alcanzan millones de vértices, polígonos, voxeles, partículas, texeles, especialmente cuando muchas de estas cosas deben completarse varias veces por segundo para proporcionar Comentarios interactivos en tiempo real.

Dicho esto, no hay un énfasis tan fuerte en la complejidad algorítmica en la discusión entre colegas, tal vez porque se da por sentado y es algo "rudimentario". En general, se asume que si está escribiendo un trazador de ruta que operará en tiempo logarítmico o mejor, y que las estructuras de datos, como las jerarquías de volumen de delimitación, son familiares y relativamente triviales de implementar para el lector. Incluso tuve un colega experto que decía que el multihilo y el SIMD son más importantes que los algoritmos, y no creo que lo dijera en el sentido de que se podría esperar mucho al paralelizar una burbuja. Creo que dijo que debido a que daba por sentado que aplicaríamos algoritmos sensibles, y el resto del desafío a menudo es la paralelización y la elección y adaptación de algoritmos y el diseño de la representación de datos para operar en paralelo.

A menudo, gran parte del enfoque se centra en tomar muchos de estos algoritmos conocidos y hacer que exploten mejor las características subyacentes del hardware, como el caché de la CPU, los registros e instrucciones SIMD, las GPU y los múltiples núcleos. Por ejemplo, Intel ideó una forma novedosa de tomar el antiguo BVH familiar y proponer el concepto de "paquetes de rayos", básicamente probando múltiples rayos coherentes a la vez con un tipo recursivo de recorrido de árboles (que podría sonar así) Viene con su parte de complejidad y gastos generales, excepto que está más que compensado por el hecho de que esos rayos ahora se pueden probar simultáneamente para las intersecciones de rayos / AABB y rayos / triángulo a través de las instrucciones y registros de SIMD). Otros trazadores de ruta de vanguardia han logrado implementar dichos índices espaciales y realizar las intersecciones de rayos directamente en la GPU.

Algo similar con la subdivisión catmull-clark, que es algo muy rudimentario en gráficos de computadora. Pero hoy en día, lo que es competitivo y eficiente y súper eficiente son las implementaciones de GPU que se aproximan a la subdivisión de CC utilizando los parches de Gregory, popularizados por Charles Loop y luego adoptados por Pixar. La implementación de CPU más sencilla ahora es bastante obsoleta, no necesariamente porque fue reemplazada en términos de complejidad algorítmica, sino porque fue reemplazada por algo que funciona bien con la GPU.

Y, por lo general, ese gran desafío en estos días no es encontrar el mejor algoritmo de una manera que sea relativamente independiente de las características subyacentes del hardware. En realidad, puse mi pie en la industria al idear una estructura de aceleración novedosa que aceleró significativamente la detección de colisiones para personajes animados y otros cuerpos blandos en los años 90 utilizando un enfoque de segmentación jerárquica en lugar de un índice espacial, lo que me ayudó mucho. ofertas de trabajo, pero en estos días ya no es tan impresionante ya que lo publiqué mucho antes de que tuviéramos tan impresionantes cachés de CPU y múltiples núcleos y GPU programables, y lo que no, y hoy en día utilizo un enfoque completamente diferente como resultado de los cambios significativos en el hardware subyacente. Así que el enfoque en realidad se ha orientado más hacia lo que podría ser en el ámbito de las "micro-optimizaciones" en mi caso sobre conceptos algorítmicos novedosos porque ahora tenemos múltiples núcleos, registros AVX, sombreadores de GPU, etc. Es un juego de pelota diferente a Ahora, donde no puedo esperar competir con un algoritmo genial, a menos que realmente funcione bien con la naturaleza peculiar del hardware de hoy en día, que en especial requiere mucha atención y cuidado para explotarlo por completo.

    
respondido por el Dragon Energy 25.12.2018 - 13:42
0

Una vez me topé con un problema en el que un algoritmo generalmente se ejecutaba en O (n), pero en circunstancias raras y extremadamente improbables necesitaría tiempo O (n ^ 3): las circunstancias "raras" eran un directorio que contenía archivos con nombres que eran válidos en un sistema operativo pero no en otro.

Nadie tuvo problemas. Luego, un cliente utilizó una estrategia para nombrar archivos que se ejecutarían sistemáticamente en el caso O (n ^ 3), y con unos 100 archivos, el sistema llegó a un punto muerto virtual. El resultado fue que el algoritmo tuvo que ser cambiado.

    
respondido por el gnasher729 25.12.2018 - 21:20
0

Tres más que no se han mencionado:

1) Muchos juegos de estrategia en tiempo real. Mira aquellos que tienen unidades que no pueden compartir una posición. Observe lo que sucede en la búsqueda de caminos cuando un grupo grande de unidades se mueve a través de un terreno restringido. Todavía tengo que encontrar un juego sin algún tipo de problema sustancial con esto porque simplemente no hay suficiente CPU disponible.

2) Muchos problemas de optimización. (Edit: desde que escribí esta respuesta, he acertado a una. Mi objetivo era podar las rutas redundantes para dejar a todos los nodos conectados con el peso mínimo de las rutas de conexión. Mi enfoque original funcionó bastante bien hasta que moví más de la poda Para esa rutina, me di cuenta de que era 2 ^ n. Ahora es n ^ 2, aunque a veces eso puede producir un resultado ligeramente no óptimo.)

3) Cosas que deben operar con grandes cantidades de datos en tiempo real. Considere un DVD: normalmente obtiene 2 horas de video en 4.7 gb. Considere un archivo de video típico con la misma resolución: esas 2 horas de video generalmente vendrán en menos de 1 gb. La razón de esto es que cuando se estableció la especificación del DVD, no se podía crear un reproductor de DVD a un precio razonable que pudiera descodificar los formatos más modernos con la suficiente rapidez.

    
respondido por el Loren Pechtel 12.02.2012 - 04:09
0

Bueno, cualquier aplicación que se ejecute normalmente en una supercomputadora ( lista de las máquinas más grandes ) califica. Estos son diversos, pero una gran subclase de ellos son las simulaciones físicas:

  • Simulaciones de física:
    • Previsión del tiempo
    • Simulaciones de clima
    • Simulaciones de estrellas en explosión, etc.
    • Simulaciones de explosiones de armas nucleares
    • Simulaciones aerodinámicas de coches / aviones / trenes, etc.
    • ...
  • Imágenes de computación a partir de datos de radiotelescopios
  • aplicaciones biológicas:
    • Cosas con secuencias de ADN (no estoy realmente en esas)
    • Material bioquímico como plegamiento de proteínas
    • Simulaciones de cómo las células nerviosas trabajan juntas para procesar la información
    • Simulaciones de otras interacciones complejas como los ecosistemas
    • ...
  • ...

Estos son solo los temas principales de mi cabeza, pero solo lea la lista de las diferentes supercomputadoras y comprenda que todas y cada una de ellas están diseñadas para permitir algunos tipos de cómputos que no serían posibles sin tan gigantesco máquinas.

Y, una vez que vea que realmente necesitamos estas máquinas, comprenda cuántos costos se pueden ahorrar, simplemente acelerando estas aplicaciones en un 10% . Cualquier optimización de estos códigos aumenta directamente la cantidad de resultados que podemos obtener de estas máquinas.

    
respondido por el cmaster 26.12.2018 - 00:55

Lea otras preguntas en las etiquetas