Para muchos problemas, el algoritmo con la mejor complejidad asintótica tiene un factor constante muy grande que está oculto por la notación O grande. Esto ocurre en la multiplicación de matrices, la multiplicación de enteros (específicamente, el reciente algoritmo de multiplicación de enteros O (n log n) de Harvey y van der Hoeven), las redes de clasificación de baja profundidad y la búsqueda de gráficos menores, para hacer algunos. Tales algoritmos a veces se llaman algoritmos galácticos.
Tenga en cuenta que para otros algoritmos, como la clasificación general y la suma de enteros, los algoritmos se conocen con una complejidad asintótica óptima y pequeños factores constantes.
¿Qué investigación se ha hecho para separar los algoritmos anteriores de los últimos algoritmos, desde una perspectiva teórica?
Soy consciente de que las constantes ocultas a menudo se omiten para ocultar la distinción entre diferentes modelos de cálculo. Sin embargo, estoy seguro de que, bajo una amplia variedad de modelos diferentes, estos algoritmos galácticos serán más lentos que los algoritmos asintóticamente peores para entradas de un tamaño de mil millones, por ejemplo. La distinción no es sutil, en algunos casos. ¿Se ha hecho riguroso?
Por ejemplo, uno podría inventar un modelo de cómputo muy simple, como una máquina von Neumann con un ISA muy simple, y luego implementar los algoritmos y vincular sus tiempos de ejecución con constantes explícitas. ¿Se ha hecho esto para una variedad de algoritmos?
Respuestas:
Un lugar donde se aborda esto de una manera interesante para una determinada clase de algoritmos y problemas combinatorios es en la combinatoria analítica . El enfoque principal descrito es similar a lo que sugiere: comienza con una implementación concreta de un algoritmo e identifica alguna operación repetida (generalmente la más pesada) que usará para asociar una complejidad explícitamente contable para la ejecución de la entrada de un determinado tamaño en la forma del número que se realiza la operación elegida.norte Cnorte
La metodología no requiere arreglar ningún modelo específico de computación, aunque eso podría ser útil, por supuesto. También tenga en cuenta que puede intentar calcular el comportamiento del peor de los casos o el comportamiento esperado, o aún algo más.
El ingrediente más importante en esta metodología es el análisis de las funciones generadoras de estos valores. A veces puede obtener aproximaciones asintóticas muy precisas utilizando métodos de análisis complejo.
Un ejemplo simple que se trata en el libro es quicksort. Esto tiene un tiempo de ejecución cuadrático en el peor de los casos, pero en la práctica supera a la mayoría de los algoritmos . Al hacer un análisis preciso del costo esperado de quicksort y lo compara con mergesort, ve que se espera que supere a este último de un tamaño de alrededor de 10, si no recuerdo mal. Para poder calcular este tipo de cosas, por supuesto, no puede ignorar las constantes ocultas.O ( n logn )
De hecho, en la clasificación rápida, ordena una lista ordenando recursivamente las sublistas, de modo que obtendrá una mejora para todos los tamaños si usa mergesort en listas más pequeñas que el tamaño 10. Una nota interesante en el libro menciona que en alguna biblioteca de Microsoft de código abierto, el algoritmo de ordenación genérico se implementa como ordenación rápida hasta que se reduce a un tamaño de 10, después de lo cual se usa mergesort. En los comentarios del código se menciona que las pruebas de rendimiento mostraron que este valor era óptimo.
fuente