Algoritmo determinista

Tipos de algoritmos en informática

En informática , un algoritmo determinista es un algoritmo que, dada una entrada particular, siempre producirá la misma salida, y la máquina subyacente siempre pasará por la misma secuencia de estados. Los algoritmos deterministas son, con diferencia, el tipo de algoritmo más estudiado y conocido, así como uno de los más prácticos, ya que se pueden ejecutar en máquinas reales de forma eficiente.

Formalmente, un algoritmo determinista calcula una función matemática ; una función tiene un valor único para cualquier entrada en su dominio , y el algoritmo es un proceso que produce este valor particular como salida.

Definición formal

Los algoritmos deterministas pueden definirse en términos de una máquina de estados : un estado describe lo que está haciendo una máquina en un instante particular en el tiempo. Las máquinas de estados pasan de manera discreta de un estado a otro. Justo después de que ingresamos la entrada, la máquina está en su estado inicial o estado de inicio . Si la máquina es determinista, esto significa que a partir de este punto, su estado actual determina cuál será su próximo estado; su curso a través del conjunto de estados está predeterminado. Nótese que una máquina puede ser determinista y aún así nunca detenerse o terminar, y por lo tanto no entregar un resultado.

Ejemplos de máquinas abstractas particulares que son deterministas incluyen la máquina de Turing determinista y el autómata finito determinista .

Algoritmos no deterministas

Una variedad de factores pueden hacer que un algoritmo se comporte de una manera que no es determinista o no determinista:

  • Si utiliza un estado externo distinto de la entrada, como una entrada de usuario, una variable global , un valor de temporizador de hardware, un valor aleatorio o datos de disco almacenados.
  • Si funciona de una manera sensible al tiempo, por ejemplo, si tiene varios procesadores escribiendo los mismos datos al mismo tiempo, en este caso, el orden preciso en el que cada procesador escribe sus datos afectará el resultado.
  • Si un error de hardware provoca que su estado cambie de forma inesperada.

Aunque los programas reales rara vez son puramente deterministas, es más fácil para los humanos y para otros programas razonar sobre programas que sí lo son. Por este motivo, la mayoría de los lenguajes de programación , y especialmente los lenguajes de programación funcional , hacen un esfuerzo por evitar que los eventos anteriores ocurran excepto en condiciones controladas.

La prevalencia de procesadores multinúcleo ha resultado en un aumento del interés en el determinismo en la programación paralela y los desafíos del no determinismo han sido bien documentados. [1] [2] Se han propuesto varias herramientas para ayudar a lidiar con los desafíos [3] [4] [5] [6] para lidiar con los bloqueos y las condiciones de carrera .

Desventajas del determinismo

En algunos casos, resulta ventajoso que un programa presente un comportamiento no determinista. El comportamiento de un programa de barajado de cartas utilizado en un juego de blackjack , por ejemplo, no debería ser predecible para los jugadores, incluso si el código fuente del programa es visible. El uso de un generador de números pseudoaleatorios a menudo no es suficiente para garantizar que los jugadores no puedan predecir el resultado de un barajado. Un jugador astuto podría adivinar con precisión los números que elegirá el generador y así determinar todo el contenido de la baraja con antelación, lo que le permitiría hacer trampa; por ejemplo, el Grupo de Seguridad de Software de Reliable Software Technologies pudo hacer esto para una implementación de Texas Hold 'em Poker que es distribuido por ASF Software, Inc, lo que les permite predecir de forma consistente el resultado de las manos con antelación. [7] Estos problemas se pueden evitar, en parte, mediante el uso de un generador de números pseudoaleatorios criptográficamente seguro , pero sigue siendo necesario que se utilice una semilla aleatoria impredecible para inicializar el generador. Para este propósito, se requiere una fuente de no determinismo, como la proporcionada por un generador de números aleatorios de hardware .

Nótese que una respuesta negativa al problema P=NP no implicaría que los programas con salida no determinista sean teóricamente más potentes que aquellos con salida determinista. La clase de complejidad NP (complejidad) se puede definir sin ninguna referencia al no determinismo utilizando la definición basada en verificadores .

Categorías deterministas en las lenguas

Mercurio

El lenguaje de programación lógico-funcional Mercury establece diferentes categorías de determinismo para los modos de predicado como se explica en la referencia. [8] [9]

Haskell

Haskell proporciona varios mecanismos:

  • No determinismo o noción de fracaso
    • Los tipos Quizás y Cualquiera incluyen la noción de éxito en el resultado.
    • El método fail de la clase Monad, puede usarse para señalar el fail como excepción.
    • La mónada Maybe y el transformador de mónada MaybeT permiten cálculos fallidos (detienen la secuencia de cálculo y devuelven Nothing) [10]
  • Neterminismo/no determinismo con múltiples soluciones
    • Puede recuperar todos los resultados posibles de un cálculo de resultados múltiples, envolviendo su tipo de resultado en una mónada MonadPlus . (su método mzero hace que un resultado falle y mplus recopila los resultados exitosos). [11]

Familia ML y lenguajes derivados

Como se ve en Standard ML , OCaml y Scala

  • El tipo de opción incluye la noción de éxito.

Java

En Java , el valor de referencia nulo puede representar un resultado fallido (fuera del dominio).

Véase también

Referencias

  1. ^ Edward A. Lee. "El problema con los hilos" (PDF) . Consultado el 29 de mayo de 2009 .
  2. ^ Bocchino Jr., Robert L.; Adve, Vikram S.; Adve, Sarita V.; Snir, Marc (2009). La programación paralela debe ser determinista por defecto. Taller USENIX sobre temas de actualidad en paralelismo.
  3. ^ "Comprobador de subprocesos de Intel Parallel Inspector" . Consultado el 29 de mayo de 2009 .
  4. ^ Yuan Lin. "Detección de bloqueos y carreras de datos con Sun Studio Thread Analyzer" (PDF) . Consultado el 29 de mayo de 2009 .
  5. ^ Intel. «Intel Parallel Inspector» . Consultado el 29 de mayo de 2009 .
  6. ^ David Worthington. «Intel aborda el ciclo de vida del desarrollo con Parallel Studio». Archivado desde el original el 28 de mayo de 2009. Consultado el 26 de mayo de 2009 .
  7. ^ McGraw, Gary ; Viega, John . "Haga que su software se comporte: Jugar con los números: Cómo hacer trampa en los juegos de azar en línea". IBM . Archivado desde el original el 13 de marzo de 2008 . Consultado el 2 de julio de 2007 .
  8. ^ "Categorías de determinismo en el lenguaje de programación Mercury". Archivado desde el original el 3 de julio de 2012. Consultado el 23 de febrero de 2013 .
  9. ^ "Modos de predicado de Mercury". Archivado desde el original el 3 de julio de 2012. Consultado el 25 de febrero de 2013 .
  10. ^ "Representando el fracaso usando la mónada Maybe".
  11. ^ "La clase MonadPlus".
Obtenido de "https://es.wikipedia.org/w/index.php?title=Algoritmo_determinista&oldid=1241385965"