una máquina de estados toma datos que pueden o no transformar su estado en uno de un conjunto finito de otros estados. ¿Cómo es eso diferente de cualquier otro programa de computadora?
Algunas respuestas aquí enfatizan que en nuestro (probablemente) universo finito todo es finito, todos los programas de computadora se ejecutan en tiempo finito, por lo tanto, técnicamente todo es una máquina de estado finito. Eso es "técnicamente correcto (el mejor tipo de correcto)", pero también pierde completamente el punto.
La esencia es esta: - Algunos programas de computadora requieren más memoria de trabajo cuando obtienen entradas más grandes y complejas. Algunos no lo hacen.
Si se da cuenta de esto, obtendrá una visión teórico-informativa que puede permitirle escribir programas más eficientes y elegantes cuando encuentre el tipo de problema dado. También le permitirá reconocer el tipo de problema donde esto puede aplicarse.
Aquí hay dos ejemplos de juguetes:
Problema 1: un programa recibe una lista de caracteres en la entrada estándar. Después de procesar todos los caracteres, el programa debe imprimir si el número de caracteres "x" en la entrada fue impar o par .
Problema 2: un programa recibe una lista de caracteres en la entrada estándar. Una vez procesados todos los caracteres, el programa debe imprimir si el número de caracteres "x" en la entrada fue menor , igual o mayor que el número de caracteres "y".
Es posible que desee dejar de leer ahora, resolver los problemas en su lenguaje de programación favorito (o simplemente un pseudocódigo) y regresar más tarde.
...
Lo importante que puede haber notado es lo siguiente: para implementar la solución al problema 1 correctamente, solo necesita un poco de memoria. No tiene que calcular cuántas "x" ha procesado, solo si el número de "x" procesadas hasta ahora fue impar o par. Cuando encuentres otra "x", voltea el bit. Al final del programa, mire el bit e imprima la respuesta.
¿Su entrada contiene docenas de caracteres? Miles de personajes? ¿Personajes de Googolplex (hipotéticamente hablando, por supuesto)? No importa; un poco de memoria de trabajo seguirá siendo suficiente.
No puede hacer lo mismo con el problema 2. Al leer los caracteres, debe recordar la diferencia entre la cantidad de "x" y "y" ya procesadas; de lo contrario, no puede imprimir la respuesta correcta de manera confiable. Usted puede darse cuenta de que en realidad no es necesario recordar tanto el número de "x" 's e 'Y'' s - sólo su diferencia, hasta el momento; un valor entero que aumentará cuando encuentre otra "x", y disminuya cuando encuentre otra "y", pero aún así, si decide usar, por ejemplo, 32 bits de memoria para mantener este valor, puede obtener una entrada ( varios miles de millones de caracteres) que no puede procesar correctamente con la cantidad limitada de memoria dada.
Esto es lo que queremos decir cuando decimos que el problema 1 puede resolverse con una "máquina de estado" y que el problema 2 no. Una cantidad limitada de memoria es suficiente para una entrada de cualquier tamaño.
(Por supuesto, también podría escribir una solución ineficiente para el problema 1, donde trataría de contar todas las "x" y luego también podría tener un problema de falta de memoria. Pero la diferencia es que un solución eficaz al problema 1 existe , mientras que una solución de manera similar eficiente para el problema 2 hace no .)
¿Por qué es esto importante en la vida real?
Primero, a diferencia de estos dos ejemplos de juguetes, el dilema puede no estar entre literalmente un valor entero de un bit y uno, sino entre una estructura de datos grande y otra aún mayor. A veces, la estructura de datos "aún más grande" no cabe en la memoria de la computadora, o ralentiza suficientemente el programa, incluso para entradas realistas.
En segundo lugar, la solución que usa la máquina de estado probablemente será mucho más rápida. También escalará linealmente con la longitud de entrada; es decir, procesar una entrada 10 veces más larga requerirá 10 veces más tiempo (a diferencia de, por ejemplo, 100 veces más tiempo). Esa es una propiedad deseada cuando necesita procesar una gran cantidad de datos.
Tercero, el uso de memoria limitado frente a ilimitado tiene un impacto en la seguridad . Si escribe un programa que solo requiere memoria limitada, no tiene que preocuparse por los desbordamientos de memoria y cómo podrían abusarse de ellos para comprometer la seguridad de todo el sistema.
Cuarto, esto es parte de lo que debería ser un plan de estudios estándar de informática en cualquier escuela decente: lenguajes formales , autómatas , complejidad computacional , etc. Para comprender la imagen más amplia detrás del diseño de la computadora, en lugar de simplemente "uhh, puse algunos fragmentos de código de Internet juntos, realmente espero que funcione, pero no puedo decir con certeza".
Para aprovechar esta teoría, realmente no necesita ninguna máquina especial, ningún marco o biblioteca ... solo necesita darse cuenta de "oh, esta parte del problema puede resolverse realmente usando una cantidad finita de memoria" y escribir su programa (en su lenguaje de programación favorito) en consecuencia. Pero en algunas situaciones es mejor usar una biblioteca existente, para no tener que reinventar la rueda.