¿Cuál es la diferencia entre un algoritmo polinomial y uno pseudo-polinomial?

Si [math] \ Pi [/ math] es un problema y [math] I [/ math] es una instancia del problema, entonces un algoritmo polinómico que resuelve [math] \ Pi [/ math] opera en el polinomio de tiempo en el Representación binaria de [matemáticas] I [/ matemáticas].

Por ejemplo, supongamos que deseo determinar si un número dado [math] n [/ math] exhibe cierta propiedad. Un algoritmo polinómico que resuelva el problema se ejecutará en [matemática] O (m ^ k) [/ matemática] durante algún tiempo [matemática] k [/ matemática], donde [matemática] m [/ matemática] es la longitud de la representación binaria de la entrada [math] n [/ math] (en este caso [math] m = \ lfloor \ log_2 n \ rfloor + 1 [/ math]).

Un algoritmo pseudopolinomial que resuelve un problema [matemática] \ Pi [/ matemática] opera en el tiempo polinomial en la representación unaria (valor numérico) de la entrada [matemática] I [/ matemática]. En nuestro ejemplo anterior, un algoritmo de tiempo pseudo-polinomial tendrá tiempo de ejecución [math] O (n ^ k) [/ math], ya que [math] n [/ math] es la longitud de la representación unaria de [math] n [/ math] ([math] \ underbrace {111 … 1} _ \ textrm {n} [/ math]).

Ahora que entendemos las definiciones, la pregunta es ¿por qué nos interesan los algoritmos que se ejecutan en el polinomio en el tiempo en el valor numérico de la entrada ? ¡Nuestras computadoras representan datos en binario!

Bueno, resulta que los algoritmos de tiempo pseudo-polinomiales son muy útiles en la construcción de un PTAS (esquema de aproximación de tiempo polinomial) para ciertos problemas ([matemáticos] NP [/ matemáticos] completos). ¿Porqué es eso?

1. El valor numérico de la entrada crece linealmente con el valor de entrada, lo que significa que nuestra métrica para el tamaño ya crece bastante rápido, por lo que los algoritmos de pasos adicionales que pueden necesitar para producir una solución no “agregan mucho” al aumento ya rápido de la métrica Por lo tanto, es más fácil encontrar algoritmos que operen en tiempo pseudo-polinomial.
2. Una vez que encontremos algoritmos de tiempo pseudo-polinomiales, podemos usarlos para resolver eficientemente problemas donde la representación unaria está garantizada por un polinomio en la representación binaria. (Por ejemplo, considere el problema de la mochila, pero con la restricción de que el beneficio asociado con cada elemento está limitado por un polinomio en el número total de elementos disponibles. Podemos usar un algoritmo de tiempo pseudo-polinomial para resolver este problema de manera eficiente).
3. En los casos en que no exista un límite polinómico en el valor (como con problemas generales de [math] NP [/ math]) podemos traducir una instancia de un problema [math] I [/ math] en un nuevo instancia [matemática] I ‘[/ matemática] que está limitada de la manera deseada, sufriendo un error modesto y controlado en el proceso (ya que estamos ignorando algunos bits menos significativos de la entrada para comprimirla). ¡Esto significa que podemos aproximar, con un parámetro de error controlado, soluciones a problemas que de otro modo todavía tenemos que resolver de manera eficiente!

Así es exactamente cómo, por ejemplo, encontramos algoritmos que encuentran soluciones al problema de la Mochila que se acercan arbitrariamente a las soluciones óptimas, es decir, [math] (1- \ epsilon) OPT [/ math], donde los algoritmos operan en tiempo polinomial tanto en el tamaño de la entrada como en [math] 1 / \ epsilon [/ math]. ¡Hurra!

El artículo de Wikipedia sobre el tiempo pseudo-polinomial captura la idea perfectamente:

En la teoría de la complejidad computacional, un algoritmo numérico se ejecuta en tiempo pseudo-polinomial si su tiempo de ejecución es polinomial en el valor numérico de la entrada (que es exponencial en la longitud de la entrada, su número de dígitos).

Un algoritmo de tiempo polinómico tiene un polinomio de tiempo de ejecución en la longitud de la entrada.
Un algoritmo pseudo-polinomial, por otro lado, toma tiempo, que es polinómico en la longitud de la entrada si la entrada se escribe en forma unaria . Como señaló Justin Rising, esto es lo mismo que el polinomio en el valor numérico de la entrada.
Los ejemplos clásicos del algoritmo de tiempo pseudo-polinomial incluyen la programación dinámica para el problema de la mochila y el embalaje del contenedor.

Puede verificar Solución – FaaS y complejidad pseudo-polinomial

More Interesting

¿Cómo sabe la CPU que estamos usando el complemento de uno o el complemento de dos para representar números negativos?

Cómo mejorar mi forma analítica de pensar para trabajar matemáticamente para la programación de computadoras

¿Es elusiva la comprensión fundamental del aprendizaje automático? ¿Requiere habilidad matemática innata?

¿Cuántas matemáticas se necesitan en la codificación?

¿Se utiliza la teoría de grupos en la IA?

¿Dónde puedo conocer y salir con profesores que trabajan en la intersección de algoritmos de aproximación y teoría de números algebraicos?

Cómo convertir -57.45 a doble precisión IEEE

Sistemas distribuidos: ¿Cuál es el significado exacto de A (Disponibilidad) y qué significa en el teorema CAP de Brewer?

¿Cuál es la diferencia entre matemática y ciencia?

¿Qué tan grande es el almacenamiento necesario para almacenar todas las combinaciones de números primos de 4096 bits como una tabla de búsqueda para descifrar RSA?

¿Podemos modificar la máquina de turing?

¿Por qué las máquinas de Turing son un equivalente teórico tan prolífico de lo que puede hacer una computadora real?

¿Por qué la mayoría de los lenguajes de programación prohíben las "desigualdades sandwich"? En matemáticas, es común ver 'desigualdades en emparedado' que muestran que una cantidad es mayor que otra pero menor que otra, por ejemplo, a <b <c significa lo mismo que a <b && b <c.

¿Cómo resuelven las computadoras fórmulas y ecuaciones matemáticas?

Programación competitiva: ¿cómo se soluciona este problema en el Quora Haqathon?