¿Qué significa decir que un algoritmo es sólido y completo?

33

Escuché diferentes interpretaciones de sonido y completas . Entiendo que lo completo significa encontrar una solución si hay una. ¿Qué significa decir que un algoritmo es sólido ?

¿Qué significa decir que un algoritmo es sólido y completo?

mutelogan
fuente
Le sugiero que reevalúe la respuesta que aceptó dado que la respuesta es incorrecta.
BlackJack
Acabo de hacer eso :)
mutelogan

Respuestas:

50

Estos son términos muy específicos relacionados con la lógica.

Aquí hay algunos puntos de partida:

http://en.wikipedia.org/wiki/Soundness

http://en.wikipedia.org/wiki/Completeness_(logic)

Básicamente, la solidez (de un algoritmo) significa que el algoritmo no produce ningún resultado que sea falso. Si, por ejemplo, tengo un algoritmo de clasificación que a veces no devuelve una lista ordenada, el algoritmo no funciona.

La integridad, por otro lado, significa que el algoritmo aborda todas las entradas posibles y no pierde ninguna. Entonces, si mi algoritmo de clasificación nunca devuelve una lista sin clasificar, sino que simplemente se niega a trabajar en listas que contenían el número 7, no estaría completa.

Está completo y suena si funciona en todas las entradas (semánticamente válidas en el mundo del programa) y siempre obtiene la respuesta correcta.

Erik Dietrich
fuente
Gracias. Estaba realmente confundido sobre lo que significa la solidez . Estaba recibiendo múltiples respuestas.
Mutelogan
Feliz si ayudó ... :)
Erik Dietrich
13
Un ejemplo sería la búsqueda binaria, es sólida, pero no está completa. No puede funcionar en listas no ordenadas.
Malfist
3
@Malfist, pero ¿no está ordenado el 'mundo del programa'?
Andres
1
"Un algoritmo se comporta mal en entradas no válidas" no afecta la solidez o integridad, por lo que ni la búsqueda binaria ni los tipos de comparación son relevantes: ambos algoritmos son sólidos y completos para las entradas válidas.
Blaisorblade
15

Encuentro la respuesta de Erik Dietrich un poco confusa. Lo siguiente es mejor:

Un algoritmo suena si, cada vez que devuelve una respuesta, esa respuesta es verdadera. Un algoritmo está completo si garantiza devolver una respuesta correcta para cualquier entrada arbitraria (o, si no existe una respuesta, garantiza devolver la falla).

Dos puntos importantes:

  1. La solidez es una garantía débil. No promete que A terminará.
  2. La solidez y la integridad son conceptos relacionados; de hecho son el inverso lógico el uno del otro. es decir, la solidez dice que si se devuelve una respuesta, esa respuesta es verdadera. La integridad dice que una respuesta es verdadera si se devuelve.

Considere, por ejemplo, un algoritmo de clasificación A que recibe como entrada una lista de números. Decimos que A es sólido si cada vez que devuelve un resultado ese resultado es una lista ordenada. Del mismo modo, decimos que A está completo si se garantiza que devolverá una lista ordenada cada vez que le demos una lista de números.

Daniel
fuente
¿Por qué estás confundido? "Un algoritmo suena si, cada vez que devuelve una respuesta, esa respuesta es verdadera". significa lo mismo que "Básicamente, la solidez (de un algoritmo) significa que el algoritmo no produce ningún resultado que no sea cierto". Estos significan lo mismo. En cuanto a su definición (muy breve) de integridad, no coincide con nada en el enlace de wikipedia y no cita ninguna referencia propia. Tengo que decir que las definiciones de Erik son más útiles en la práctica. Si los suyos son correctos, debe proporcionar una mejor evidencia y más carne.
itsbruce
1
Solo para aclarar, cuando dice "La integridad dice que una respuesta es verdadera si se devuelve", quiere decir que la respuesta es "correcta" ¿verdad?
Dois
1
“Una respuesta es verdadera si se devuelve” significa literalmente lo mismo que “si se devuelve una respuesta, es verdadera”. Además, las respuestas no pueden ser "verdaderas", solo correctas. softwareengineering.stackexchange.com/a/311649/21277 es más correcto.
Blaisorblade
2

Estos términos provienen de la teoría de la computación, por lo que son más significativos en el contexto de la teoría de la computación que en el contexto de la ingeniería de software.

En la mayoría de los modelos estándar de computación, los problemas informáticos se representan como lenguajes . Un lenguaje es un conjunto de cadenas. Un algoritmo, entonces, es solo un sistema o procedimiento que decide si una cadena dada es miembro de algún lenguaje (devolviendo verdadero o falso). En términos de ingeniería de software, la teoría de la computación está específicamente relacionada con funciones que se ven así, suponiendo que las cadenas son inmutables:

boolean some_function(string argument){...}

Llamamos a esta función completa si devuelve verdadero para cada argumento que es miembro del lenguaje. Lo llamamos sonido si devuelve falso para cada argumento que no sea miembro del lenguaje.

En otras palabras, está completo si siempre devuelve verdadero cuando queremos que devuelva verdadero, y suena si siempre devuelve falso cuando queremos que devuelva falso.

¿Cómo se traduce esto a otros tipos de funciones? Como resultado, casi siempre es posible rellenar una cantidad arbitraria de datos en una cadena y reconstituirla dentro de la función. Entonces, la restricción sobre el tipo de argumento y la aridad no es más que una simplificación teórica. Sin embargo, la restricción en el tipo de devolución es más importante. Los problemas que requieren un resultado booleano se denominan problemas de decisión . Mucha teoría de la computación involucra problemas de decisión; los conjuntos P y NP están restringidos a problemas de decisión (y NP, al menos, no podría definirse razonablemente sin esta restricción). El problema de detención es otro ejemplo de un problema de decisión muy estudiado.

Es mi opinión que estos términos no se generalizan fuera del dominio de los problemas de decisión, por lo que la diferencia entre ellos no es realmente significativa cuando se discute una función general.

Kevin
fuente
-2

Hay respuestas mucho mejores en el SO . Básicamente, proporciona una recopilación de datos y criterios para buscar. El algoritmo de sonido solo captura el pez que coincide con los criterios, pero puede faltar algunos elementos de datos. El algoritmo completo produce un superconjunto de resultados solicitados, lo que significa que recibirá algo de basura además de los resultados solicitados. El algoritmo de sonido es más conservador.

El estadístico probablemente diría que el algoritmo de sonido está sesgado hacia errores de tipo I (no acepta los candidatos correctos), mientras que el algoritmo completo está sesgado hacia errores de tipo II (para aceptar los candidatos falsos).

ingrese la descripción de la imagen aquí

Valentin Tihomirov
fuente