Esta puede ser una pregunta ridícula, pero ¿es posible tener un problema que en realidad se vuelve más fácil a medida que las entradas crecen en tamaño? Dudo que algún problema práctico sea así, pero tal vez podamos inventar un problema degenerado que tenga esta propiedad. Por ejemplo, tal vez comienza a "resolverse a sí mismo" a medida que crece, o se comporta de otra manera extraña.
algorithms
asymptotics
dsaxton
fuente
fuente
Respuestas:
No, no es posible: al menos, no en un sentido asintótico, donde se requiere que el problema se vuelva cada vez más fácil, para siempre, como .n → ∞
Deje que sea el mejor tiempo de ejecución posible para resolver dicho problema, donde es el tamaño de la entrada. Tenga en cuenta que el tiempo de ejecución es un recuento del número de instrucciones ejecutadas por el algoritmo, por lo que debe ser un número entero no negativo. En otras palabras, para todo . Ahora, si consideramos una función , vemos que no existe tal función que disminuya estrictamente monotónicamente. (Sea lo que sea , tiene que ser finito, digamos ; pero luego, dado que está disminuyendo estrictamente monotónicamente, yT( n ) norte T( n ) ∈ N norte T: N → N T( 0 ) T( 0 ) = c T ( c ) ≤ 0 T ( c + 1 ) ≤ - 1 T ( n ) n 0 n ≥ n 0 T ( n )T T( c ) ≤ 0 T( c + 1 ) ≤ - 1 , lo cual es imposible.) Por razones similares, no existe una función que disminuya estrictamente asintóticamente: de manera similar, podemos demostrar que no existe una función de tiempo de ejecución donde exista tal que para todos , está disminuyendo estrictamente monotónicamente (cualquier función de este tipo tendría que volverse eventualmente negativa).T( n ) norte0 0 n ≥ n0 0 T( n )
Por lo tanto, tal problema no puede existir, por la sencilla razón de que los tiempos de ejecución deben ser enteros no negativos.
Tenga en cuenta que esta respuesta solo cubre algoritmos deterministas (es decir, el peor tiempo de ejecución). No descarta la posibilidad de algoritmos aleatorios cuyo tiempo de ejecución esperado disminuya estrictamente monotónicamente, para siempre. No sé si es posible que exista dicho algoritmo. Agradezco a Beni Cherniavsky-Paskin por esta observación .
fuente
Aunque no es exactamente una respuesta a su pregunta, el algoritmo de búsqueda de cadenas de Boyer-Moore se acerca. Como Robert Moore dice en su página web sobre el algoritmo,
En otras palabras, en general, el algoritmo busca una instancia de una cadena objetivo en una cadena fuente y una cadena fuente fija, cuanto más larga sea la cadena objetivo, más rápido se ejecutará el algoritmo.
fuente
Claramente, desde un punto de vista matemático puro, puramente algoritmo CS, esto es imposible. Pero, de hecho, hay varios ejemplos del mundo real de cuándo ampliar su proyecto lo hace más fácil, muchos de los cuales no son intuitivos para los usuarios finales.
Instrucciones : cuanto más largas sean tus instrucciones, a veces pueden ser más fáciles. Por ejemplo, si quiero que Google Maps me dé instrucciones para ir hacia el oeste 3000 millas, podría conducir a la costa oeste y recibir instrucciones de manejo a través del país. Pero si quisiera ir 6000 millas al oeste, terminaría con instrucciones significativamente más simples: subirme a un avión desde Nueva York a Hokkaido. Darme una ruta a campo traviesa que incorpore tráfico, carreteras, clima, etc. es bastante difícil algorítmicamente, pero decirme que suba a un avión y busque vuelos en una base de datos es relativamente más simple. Gráfico ASCII de dificultad vs distancia:
Representación : digamos que quiero una representación de una cara y una representación de 1000 caras; esto es para un anuncio publicitario, por lo que ambas imágenes finales deben tener 10000 px por 5000 px. Renderizar una cara de manera realista sería difícil: a la resolución de varios miles de píxeles, debe usar máquinas realmente potentes, pero para la multitud de 1000 caras, cada cara solo necesita tener diez píxeles de ancho, ¡y puede clonarse fácilmente! Probablemente podría renderizar 1000 caras en mi computadora portátil, pero renderizar una cara realista de 10000 px de ancho requeriría mucho tiempo y máquinas potentes. Gráfico ASCII de dificultad frente a objetos renderizados, que muestra cómo la dificultad de representar n objetos en una imagen de un tamaño establecido disminuye rápidamente pero luego regresa lentamente:
Control de hardware : muchas cosas con hardware se vuelven mucho más fáciles. "Mover motor X 1 grado" es difícil y / o imposible, y tiene que lidiar con todo tipo de cosas con las que no tendría que lidiar para "mover motor X 322 grados".
Tareas de corta duración: supongamos que desea que el elemento X esté encendido (muy poco tiempo) cada segundo. Al aumentar la cantidad de tiempo que ejecuta X, necesitará software y hardware menos complejos.
fuente
Hay casos. Son los casos en los que el criterio de éxito es una función de los datos, en lugar de tratar de encontrar una respuesta única. Por ejemplo, los procesos estadísticos cuyos resultados se expresan con intervalos de confianza pueden volverse más fáciles.
Un caso particular en el que estoy pensando son los problemas que tienen una transición de comportamientos discretos a comportamientos continuos, como los flujos de fluidos. Resolver el pequeño problema dentro de un cierto grado de error puede implicar modelar todas las interacciones discretas, lo que puede requerir una supercomputadora. Los comportamientos continuos a menudo permiten simplificaciones sin producir resultados fuera de un límite de error relacionado.
fuente
La pregunta es interesante y ÚTIL, porque nuestra filosofía en informática es resolver problemas cuanto más leamos, más difícil será. Pero, de hecho, la MAYORÍA de los problemas que se presentan de la manera típica (difícil) se pueden representar fácilmente de la manera "fácil"; aun sabiendo la respuesta de DW (lo cual es incorrecto considerando que fácil no significa más rápido, significa "menos lento"; así que no tienes que encontrar tiempos negativos, tienes que encontrar el tiempo asintótico).
El truco para encontrar uno es poner la parte de la solución como pistas como una entrada, y considerar la entrada del problema como un parámetro constante.
Ejemplo: ¿Cuál es la forma más larga en automóvil entre Londres y París para evitar visitar dos veces una ciudad francesa y una británica y no visitar otro país? Ten en cuenta que debes ir a Birmingham antes que Ashford, Orleans antes que Versalles, La Rochelle antes que Limoge, etc.
Está claro que este problema con las entradas largas será más fácil que con las cortas.
Ejemplo de uso: imagine un juego administrado por la máquina, y la IA de la computadora tiene que determinar si tiene que explorar más en el juego para encontrar más pistas o si es el momento de deducir cuál es la mejor decisión para asumir .
fuente
Considere un programa que toma como entrada lo que sabe sobre una contraseña y luego intenta descifrarla. Creo que esto hace lo que quieres. Por ejemplo:
Debo agregar que esto es un truco, ya que el problema planteado de esta manera es inverso al tamaño de entrada. Puede omitir una capa de abstracción y decir que el tamaño de entrada es grande para ninguna entrada (verifique todos los símbolos y longitudes de palabras) y pequeño si ingresa la contraseña correcta al principio.
Así que todo se reduce a cuánta abstracción permites.
fuente
De hecho, tengo un problema que se reduce a medida que aumentan los datos. Una de mis aplicaciones registra los atributos de un producto en particular, digamos queso. Los atributos son, por ejemplo, CheeseType, Brand, Country, Area, MilkType, etc. Cada mes más o menos, recibo una lista de los nuevos quesos que llegaron al mercado durante ese tiempo, junto con sus atributos. Ahora, estos atributos están escritos a mano por un grupo de humanos. Algunos hacen errores tipográficos, o simplemente no conocen el valor de todos los atributos.
Cuando realiza una búsqueda en mi base de datos, trato de predecir a partir de las estadísticas a qué sabe el queso, según estos atributos. Lo que sucede es que para cada atributo, termino con un rango de valores; algunos son válidos algunos no son válidos. Eliminar o corregir estos no válidos solo es posible si tengo suficientes datos. Se trata de marcar la diferencia entre los valores reales y el ruido, sin eliminar valores raros pero válidos.
Como puede imaginar, con un volumen bajo, el ruido es demasiado importante para arreglar las cosas correctamente. Si tiene 5 instancias de Cheddar, 1 de Brie, 1 de Bri y 1 de Chedar, ¿cómo puedo saber cuál es correcto y cuál es un error tipográfico? Con más volumen, los errores tipográficos tienden a mantenerse muy bajos, pero los valores raros obtienen algunos incrementos cruciales, lo que los hace escapar del ruido (respaldado por la experiencia). En este caso, podría imaginar 50000 Cheddar, 3000 Brie, 5 Bri, 15 Chedar, por ejemplo.
Entonces, sí, algunos problemas se resuelven por sí solos cuando tienes suficientes datos.
fuente
Considere el problema NP-completo 3-SAT. Si sigue aumentando el problema al proporcionar entradas de la forma x_i = verdadero / falso, termina convirtiendo las disyunciones individuales en cláusulas de dos variables, creando así un problema 2-SAT que es decididamente P, o simplemente termina obteniendo Una respuesta verdadera / falsa.
Para el caso de que haya redundancia en las entradas x_i = verdadero / falso (la misma entrada se proporcionó muchas veces o entradas contradictorias), puede clasificar fácilmente las entradas e ignorar los valores redundantes o informar un error si los valores se contradicen.
En cualquier caso, creo que esto representa un problema 'realista' que se vuelve más fácil de resolver a medida que aumenta el número de entradas. El aspecto 'más fácil' es convertir un problema NP-completo en un problema P. Todavía puede jugar el sistema al proporcionar entradas ridículas de tal manera que solo la clasificación tomaría más tiempo que el bruto forzando el problema.
Ahora, un escenario realmente genial sería si estamos dispuestos a aceptar T (0) (utilizando la notación de DW en la respuesta anterior) puede ser infinito. Por ejemplo, T (0) podría ser equivalente a resolver el problema de detención de Turing. Si pudiéramos idear un problema tal que agregar más entradas lo convierta en un problema solucionable, habríamos encontrado oro. Tenga en cuenta que no es suficiente convertirlo en un problema solucionable asintóticamente, porque eso es tan malo como la fuerza bruta del problema.
fuente
La pregunta es: "¿es posible tener un problema que en realidad se hace más fácil a medida que las entradas crecen en tamaño?" ¿Qué pasa si las entradas son recursos para ser utilizados por el algoritmo para trabajar en un trabajo? Es de conocimiento común que cuantos más recursos, mejor. A continuación se muestra un ejemplo, en el que cuanto más empleados haya, mejor.
3) Salida:
la salida es la ruta entre las tareas que deben tomar los empleados. Cada ruta está asociada con la cantidad de empleados que la toman. Por ejemplo:
4) Posible solución:
una posible solución es calcular primero la ruta más corta a los nodos más cercanos desde A. Esta será una ruta directa. Luego, recursivamente calcule la ruta hacia adelante para cada tarea visitada. El resultado es un árbol. Por ejemplo:
fuente