Suponga que está obteniendo un número (usando bits en codificación binaria).
¿Qué tan rápido puede encontrar (o determinar que tal no existe) ?
Por ejemplo, dada la entrada , uno puede generar .
Un algoritmo ingenuo para el problema revisaría todos los valores posibles para , y buscaría un valor de que satisfaga la propiedad.
Una observación simple es que no es necesario verificar valores de menores que mayores que . Sin embargo (incluso si pudiéramos verificar solo posibles valores por valor) esto termina en un algoritmo ineficiente que es exponencial en el tamaño de entrada.
Un enfoque alternativo sería repasar los posibles valores de (es suficiente para verificar ) y para cada verificación de posibles valores. Entonces podemos usar:
Entonces, para una dada solo necesitamos verificar valores en el rango , al hacerlo mediante la búsqueda binaria (cuando es fijo, aumenta monotónicamente en ), esto da un algoritmo polinomial que se ejecuta en .
Esto todavía me parece ineficiente y supongo que esto podría resolverse en tiempo lineal (en el tamaño de entrada).
Respuestas:
No es cierto que(n−k)k<(nk) . Por ejemplo, (92)=36<49=(9−2)2 .
No he encontrado (todavía) una solución sutil utilizando las propiedades aritméticas de los coeficientes binomiales, sin embargo, puedo sugerir una fuerza bruta si eso ayuda :-)
Podría, para cada , resolver tomando una conjetura inicial (por ejemplo, ) y utilizando un método analítico como Newton-Raphson. Desea resolver . La derivada del lado izquierdo con respecto a es donde es la función digamma, que es fácil de calcular .k n k!⋅m−−−−−√k (nk)−m=0 n (ψ(n+1)−ψ(n−k+1))(nk) ψ
La complejidad de una búsqueda de Newton-Raphson solo depende de la complejidad de calcular la función y su derivada, y el número de dígitos necesarios para la solución (en nuestro caso solo necesitamos el número entero más cercano).
Entonces, en general, para cada la búsqueda debería ser (suponiendo, como parece haberlo hecho, que calcular un coeficiente binomial toma tiempo constante), por lo tanto, la complejidad total para el algoritmo que usa sus límites para sería .k O(1) k O(log(m))
fuente