¿Hay alguna forma conocida de demostrar que un algoritmo es óptimo? ¿Hay alguna forma de demostrar que un algoritmo lleva un tiempo mínimo? (El mejor método posible para lograr la tarea dada).

Oh chico. Los límites inferiores en la dificultad del problema son una de las cosas más difíciles en toda la informática. Mucho más difícil que esa pequeña pregunta fácil de P =? NP de la que quizás hayas oído hablar. Esencialmente, todavía no tenemos idea de cómo demostrar que un problema es difícil.

El TL, DR responde a su pregunta:

  • No, no hay forma conocida de que funcione en general.
  • Sí, hay algunos casos especiales: algunos algoritmos para los cuales podemos hacer tal prueba.
  • En la práctica, usted sabe que su algoritmo es óptimo porque es obvio, o no tenemos idea de cómo demostrar su optimización.

Ahora con más detalle.

¿Por qué los límites inferiores son tan difíciles? Para demostrar que un problema es fácil , solo necesita encontrar un algoritmo específico que lo resuelva de manera eficiente. Para demostrar que un problema es difícil, debe demostrar que ninguno de los infinitos algoritmos posibles puede resolverlo de manera eficiente. Y eso no se puede hacer un algoritmo a la vez. En cambio, debe encontrar alguna propiedad inherente del problema que lo dificulte. ¿Cómo encontrar tales propiedades? A excepción de algunos casos especiales bastante triviales, nadie lo sabe.

Uno de esos casos especiales triviales es el tamaño de entrada . Si puede probar que el algoritmo tiene que examinar una gran cantidad de datos, sabrá que su tiempo de ejecución debe ser al menos proporcional a la cantidad de dichos datos. El ejemplo canónico aquí: el algoritmo óptimo que determina si una matriz A de elementos n sin clasificar dada contiene un elemento dado x se ejecuta en [math] \ Theta (n) [/ math] en el peor de los casos porque tiene que examinar todos los elementos de R. (Si se te ocurre un algoritmo más rápido, no puede ser completamente correcto: si nunca examinas todos los elementos de A, ciertamente puedo obligarte a dar una respuesta incorrecta en algunas entradas). Por lo tanto, la búsqueda lineal es un algoritmo óptimo por este problema

Complementando eso, el otro caso trivial es el tamaño de salida . Un algoritmo que calcula y genera los primeros n números primos no puede ejecutarse más rápido que en [math] \ Theta (n) [/ math] simplemente porque tiene que generar n números. Un algoritmo que calcula y genera todos los primos que no exceden n no puede ejecutarse más rápido que en el tiempo [matemático] \ Theta (n / \ log n) [/ matemático] porque, asintóticamente, hay tantos primos para generar.

Una de las pocas técnicas conocidas que pueden producir límites inferiores ligeramente no triviales son los límites inferiores teóricos de la información . Hay una clase de problemas en los que la entrada es pequeña, la salida es pequeña y, sin embargo, necesitamos más tiempo para resolverlos porque el algoritmo necesita obtener suficiente información para producir la salida correcta. Los dos ejemplos canónicos aquí son buscar un elemento en una matriz ordenada y clasificar una matriz usando solo comparaciones de elementos. Por ejemplo, considere ordenar una matriz de n elementos de elementos distintos. Hay n! posibles permutaciones de la matriz, y el algoritmo de clasificación debe determinar cuál de estos n! permutaciones candidatas es la correcta que produce la matriz ordenada. Cada comparación elimina a lo sumo la mitad de los candidatos (es decir, le da a lo sumo un poco de información). Por lo tanto, el menor número de comparaciones necesarias para eliminar a todos los candidatos, excepto uno, es [math] \ log_2 (n!) [/ ​​Math], que es asintóticamente [math] \ Theta (n \ log n) [/ math]. Por lo tanto, los algoritmos clásicos como MergeSort y HeapSort son algoritmos de clasificación óptimos basados ​​en la comparación. Del mismo modo, la búsqueda binaria es lo mejor que puede hacer al buscar un elemento en una matriz ordenada.

¿Qué hay más allá de estos ejemplos bastante triviales? Bueno, hay algunos casos más en los que sabemos cómo demostrar que algún problema en particular es difícil, pero la mayoría de nuestro mapa actualmente dice que hic sunt leones . Nadie lo sabe. Como dije anteriormente, la pregunta de si P es igual a NP es solo una pequeña faceta de este gran problema.

Por ejemplo, considere un problema estándar de NP completo: determinar si un gráfico de n -vértices contiene un ciclo hamiltoniano. No sabemos si este problema puede resolverse en tiempo polinómico. Probablemente no. Ciertamente es bastante difícil. Nadie pudo resolverlo en [matemáticas] \ Theta (n ^ {1000}) [/ matemáticas] y la mayoría de los investigadores esperan que no exista dicho algoritmo. Pero si el problema es tan difícil, seguramente podemos llegar a un límite inferior en su complejidad, ¿verdad?

Bien. Existe el límite inferior del tamaño de entrada trivial: el algoritmo debe ejecutarse en [math] \ Omega (n ^ 2) [/ math], porque un gráfico con n vértices puede tener [math] \ Theta (n ^ 2) [/ matemáticas], por lo que necesitamos tiempo cuadrático solo para leer la entrada.

Y eso es. Por el momento, no sabemos nada más. Olvídate de P = NP. No tenemos idea de cómo demostrar que el problema del ciclo hamiltoniano no se puede resolver en [matemáticas] \ Theta (n ^ 2) [/ matemáticas].

Usted (quizás sin querer) hizo dos preguntas muy diferentes: “¿Hay alguna forma de demostrar que un algoritmo toma un tiempo mínimo?” y “¿Cuál es el] mejor método posible para lograr [una] tarea dada?”.

Alon Amit da un ejemplo interesante de la distinción entre los dos enfoques. Desde una perspectiva algorítmica, determinar si una matriz de tamaño [matemática] n [/ matemática] contiene el elemento [matemática] E [/ matemática] no puede ser mejor en promedio que los pasos [matemática] 1 / n [/ matemática] … dado varios supuestos razonables pero no declarados . Dados esos supuestos, uno puede probar este límite, y eso responde a su primera pregunta.

Si no está haciendo un trabajo teórico sobre algoritmos, resulta que esas suposiciones no declaradas son a menudo la diferencia entre mediocre y brillante, o manejable e imposible. Tomando su segunda pregunta: el mejor método posible es probar que el elemento [matemático] E [/ matemático] en el que estaba interesado nunca se coloca en la matriz, o siempre aterrizará en la misma posición si está allí, o la ubicación se correlaciona con alguna otra medida del sistema. En resumen, haces trampa. Mi frustración con los algoritmos, como se enseña actualmente, es que no te enseña acerca de las trampas.

Por supuesto, para algunos algoritmos.

Problema : dada una matriz de tamaño [matemática] n [/ matemática], determine si contiene el elemento “E”.

Algoritmo : escanea la matriz elemento por elemento. Si el elemento escaneado es “E”, pare y envíe Sí. De lo contrario, pase al siguiente elemento; si no hay uno, deténgase y envíe el número

Este algoritmo toma pasos [matemáticos] n [/ matemáticos] en el peor de los casos, y claramente no puede hacerlo mejor: cualquier algoritmo debe al menos examinar cada elemento de la matriz una vez.

____________

Probar que un algoritmo es óptimo significa proporcionar un límite inferior: cualquier algoritmo para el problema debe tomar al menos unos pasos, y el algoritmo óptimo logra tomar la misma cantidad. Como regla general, encontrar límites inferiores es un problema muy difícil en la teoría de la complejidad computacional. Por ejemplo, demostrar que algún problema difícil de NP requiere al menos [matemática] n ^ {\ log n} [/ matemática] para resolver sería uno de los mayores avances científicos en la historia de la humanidad: probaría que P [ math] \ neq [/ math] NP.

Si. Pero es difícil. Por ejemplo, se ha demostrado que la ordenación requiere el orden n * log (n) pasos cuando se formula de cierta manera (solo las operaciones disponibles son comparar dos elementos, no el hash).

Para algunas tareas, es posible establecer límites inferiores teóricos. Entonces, si un algoritmo particular alcanza ese límite, es óptimo (aunque puede haber otros que también lo hagan).

Como ejemplo, piense en la tarea de compresión de imágenes. Sabemos que el límite inferior para la compresión es su Entropía (teoría de la información). Si podemos demostrar que se garantiza que un algoritmo proporciona esta relación de compresión para una clase de imágenes, entonces es óptimo.