¿Es más difícil probar la corrección de algoritmos codiciosos que probar la corrección de cualquier otra clase de algoritmos?

Realmente no.

El problema principal por el cual los algoritmos codiciosos y las pruebas se mencionan a menudo en la misma oración es que es realmente fácil diseñar algoritmos codiciosos incorrectos . Hay muchas situaciones en las que un algoritmo codicioso parece plausible pero no funciona. Es por eso que a menudo se enfatiza que es importante probar la corrección de un algoritmo codicioso propuesto.


Por supuesto, importante no tiene que significar difícil . De hecho, lo contrario a menudo es cierto: si tiene el algoritmo codicioso correcto, su corrección a menudo es razonablemente fácil de mostrar. Por lo general, todo lo que tiene que hacer es demostrar que no hay forma de tomar la solución producida por su algoritmo y modificarla en una solución mejor.

Aquí hay un ejemplo simple de cómo funciona la técnica general en muchos casos.

Imagine que hay una sola bomba de agua y que [matemática] n [/ matemática] personas simplemente vinieron a usarla. Las personas llevan cubos de [matemáticas] n [/ matemáticas] volúmenes diferentes: [matemáticas] v_1, \ puntos, v_n [/ matemáticas]. ¿En qué orden deben obtener agua para minimizar el tiempo de espera total (o, equivalentemente, el tiempo de espera promedio)?

Aquí se explica cómo descubrir el algoritmo codicioso correcto junto con su prueba de corrección:

Imagine que la gente ya se alineó de alguna manera. Mira a dos personas consecutivas . Si el que está más adelante en la alineación tiene un cubo más pequeño que el que está delante de ellos, podemos intercambiarlos. Esto siempre mejorará el tiempo de espera total: la suma de los tiempos de espera de nuestros dos actores ha disminuido claramente y nadie más se vio afectado.

Y esa es básicamente la prueba completa. Un orden que puede mejorarse intercambiando dos personas no puede ser óptimo. Por lo tanto, en el orden óptimo no podemos intercambiar dos personas. Pero solo hay un orden de este tipo: el que ordena a las personas de acuerdo con el tamaño de su cubo, comenzando con el más pequeño. Por lo tanto, tenemos un algoritmo codicioso (un tipo simple) y también un argumento por el cual siempre produce la solución óptima.

Argumentos de cambio similares a menudo se pueden usar para probar la corrección de algoritmos codiciosos (o incluso para descubrirlos).

No se puede decir que cualquier prueba sea tan difícil o no lo suficientemente difícil, ya que puede ser muy fácil o intuitivo para una persona y bastante difícil para otra.

Pero en aras de una discusión; En términos de matemáticas involucradas, es más probable que digamos que algunas pruebas dadas son más complejas.

La prueba de cualquier cosa depende de la metodología utilizada para tomar las decisiones en cada paso, por ej. El teorema de Pitágoras tardó mucho tiempo en ser común y tener una prueba simple.

Las pruebas codiciosas son las mismas, algunas son muy fáciles, mientras que otras requieren ciertas lemas y relaciones complejas para continuar.

Ej . Encuentre la suma máxima posible para una matriz de enteros positivos

Ur quick ans be: suma de todos los elementos Simple.

Ex. Encuentra el camino más corto en un gráfico.

Solu Su solución no es tan simple de dar y tomar muchos escenarios específicos como el clima

  1. Los bordes son iguales en peso.
  2. Los bordes son todos positivos o no.
  3. El gráfico está dirigido o no.
  4. ¿Es un gráfico simple?

Dependiendo del caso de entrada de trabajo, creamos un algoritmo que mejor se adapte a nuestras capacidades para dar la respuesta como dijkstra en muchos casos es posible aquí.

Por extensión de lo anterior, ciertamente es lo mismo para cada tipo de metodología de resolución, ya sea codiciosa o dinámica, o divide y vencerás.

Para aprender más sobre las pruebas y problemas que se pueden resolver de forma codiciosa; busca Matroids, seguro que te encantará.

No creo que tenga mucho sentido tratar de encontrar algunas clases con pruebas más difíciles que ninguna otra, hay una gran cantidad de algoritmos codiciosos que son muy fáciles de probar, hay una gran cantidad de algoritmos de otras clases que tienen pruebas muy difíciles. Y para todas las demás clases habría sido lo mismo también.