No me ha parecido tan importante, excepto para comunicar ideas, y trabajo en campos críticos para el rendimiento (trazado de rayos, procesamiento de imágenes y mallas, sistemas de partículas, motores de física, etc.) y he tenido que idear muchos algoritmos y estructuras de datos patentados cuando se trabaja en I + D. En estas áreas, a menudo un puñado de estructuras de datos y algoritmos muy eficientes pueden generar productos innovadores completamente nuevos, mientras que los algoritmos de ayer hacen que los productos existentes queden obsoletos, por lo que siempre se busca hacer las cosas de manera más eficiente. Sin embargo, como advertencia, nunca he publicado ningún documento sobre los algoritmos que ideé. Todos eran propietarios. Si lo hiciera, necesitaría la ayuda de un matemático para formular pruebas, etc.
Sin embargo, en mi opinión, la cantidad de trabajo computacional por iteración es a menudo de interés más inmediato que la escalabilidad del algoritmo a menos que el algoritmo escale realmente mal. Si a alguien se le ocurre una técnica de vanguardia para el trazado de rayos, me interesan más las técnicas computacionales, como la forma en que representan y acceden a los datos, que la complejidad algorítmica porque la escalabilidad razonable ya es un hecho en este escenario competitivo e innovador. No puedes ser competitivo creando algoritmos que no se escalen.
Por supuesto, si está comparando la complejidad cuadrática con la linealidad lineal, esa es una gran diferencia. Pero la mayoría de las personas en mi campo son lo suficientemente competentes como para evitar aplicar un algoritmo de complejidad cuadrática en una entrada épica. Por lo tanto, la escalabilidad a menudo está profundamente implícita, y las preguntas más significativas e interesantes se convierten en: "¿Usó GPGPU? ¿SIMD? ¿Se ejecuta en paralelo? ¿Cómo representó los datos? ¿Lo reorganizó para patrones de acceso amigables para la caché? ¿Cómo? ¿Cuánta memoria toma? ¿Puede manejar este caso con firmeza? ¿Está aplazando cierto procesamiento o lo está haciendo todo de una vez? "
Incluso un algoritmo lineal puede superar a un algoritmo de tiempo lineal si el primero accede a la memoria en un patrón más óptimo, por ejemplo, o es más adecuado para el subprocesamiento múltiple y / o SIMD. A veces, incluso un algoritmo lineal puede superar a un algoritmo logarítmico por estas razones, y los algoritmos de tiempo lineal, naturalmente, superan a los algoritmos logarítmicos para entradas pequeñas.
Entonces, para mí, lo que más importa es lo que algunas personas podrían llamar "microoptimizaciones", como representaciones de datos (diseños de memoria, patrones de acceso con división de campo caliente / frío, etc.), subprocesamiento múltiple, SIMD y, ocasionalmente, GPGPU. En un campo donde todos ya son lo suficientemente competentes como para usar algoritmos decentes y de vanguardia para todo, con nuevos artículos que se publican todo el tiempo, su ventaja competitiva para vencer a los asistentes algorítmicos no proviene de mejoras en la complejidad algorítmica, sino más directa eficiencia computacional.
Mi campo está dominado por matemáticos brillantes, pero no siempre aquellos que conocen el costo computacional de lo que están haciendo o muchos de los trucos de nivel inferior para acelerar el código. Esa suele ser mi ventaja sobre ellos al diseñar algoritmos y estructuras de datos más rápidos y ajustados a pesar de que el mío es mucho menos sofisticado. Estoy jugando a lo que le gusta al hardware, a bits y bytes y haciendo que cada iteración de trabajo sea mucho más barata, incluso si estoy haciendo algunas iteraciones de trabajo más que el algoritmo realmente sofisticado: el trabajo en mi caso es drásticamente más barato. El código que escribo también tiende a ser mucho más simple. Si las personas piensan que las versiones micro optimizadas de algoritmos y estructuras de datos simples son difíciles de entender y mantener,
Como ejemplo básico, se me ocurrió una estructura de cuadrícula simple que terminó superando a un árbol KD en nuestra empresa para la detección de colisiones y la eliminación de puntos redundantes. Mi estúpida cuadrícula cruda era mucho menos sofisticada algorítmicamente y soy mucho más tonto matemáticamente y algorítmicamente que el tipo que implementó el árbol KD con su novedosa forma de encontrar el punto medio, pero simplemente ajusté el uso de memoria de mi cuadrícula y los patrones de acceso y eso fue suficiente para superar algo mucho más sofisticado.
Otra ventaja que tengo que me permite sobrevivir en un campo dominado por personas mucho más inteligentes que yo es comprender realmente cómo funciona el usuario, ya que utilizo el software que desarrollo de la misma manera. Eso me da ideas para algoritmos que realmente se alinean de manera muy inmediata con los intereses del usuario. Como un ejemplo básico allí, la mayoría de las personas intenta acelerar cosas como la detección de colisiones mediante indexación espacial. Hace casi un par de décadas, realicé una simple observación de formación de carrera para modelos orgánicos que, por ejemplo, si un personaje pone sus manos sobre su rostro, una estructura de indexación espacial querría tener que dividir nodos y hacer actualizaciones costosas si el personaje Luego se quitó la mano de la cara. Si, en cambio, particiona en función de los datos de conectividad en lugar de las posiciones de vértice, puede terminar con una estructura jerárquica estable que se actualiza muy rápidamente y nunca necesita dividir o reequilibrar el árbol (solo tiene que actualizar los cuadros delimitadores en cada cuadro de animación) ... cosas como esta: algoritmos de un niño sin una gran base matemática podría surgir si solo entendieran el concepto básico, pero los que eludieron a los matemáticos ya que no pensaban en las cosas de una manera tan cercana a cómo trabajaban los usuarios y pensaban demasiado en las propiedades de la geometría y no en cómo la geometría fue de uso común. Me llevo bastante bien apoyándome más en el conocimiento computacional general y el conocimiento del usuario final que en la magia algorítmica. De todos modos, realmente no me ha parecido tan importante centrarme en la complejidad algorítmica.