Hola.
Aquí ando con otro problema de complejidades computacionales. Me dan el siguiente código y me piden textualmente: "Explica la complejidad":
programa F(n)
k,m: vector
escribir (k,1)
escribir (m,1)
mayor_o_igual(m,n)
mientras leer(acepta)=0 hacer
sucesor(k)
mult(m,k)
mayor_o_igual(m,n)
fmientras
fin
El programa mayor_o_igual(m,n) deja el acepta en \( 1 \) si \( m\geq{n} \) y en \( 0 \) en otro caso.
El programa sucesor(k) calcula el número siguiente a \( k \).
El programa mult(m,k) calcula el producto \( m\cdot{k} \) y lo escribe en \( m \) utilizando el algoritmo elemental de multiplicación de números naturales.
Lo que hace este programa es calcular el menor natural \( p \) tal que \( p! \) es mayor que otro natural \( n \) dado. En lo sucesivo \( \left |{x}\right | \) significa "el número de dígitos de la representación binaria de \( x \)". Yo he pensado lo siguiente:
El tiempo de las sentencias anteriores al bucle no depende de \( \left |{n}\right | \), es decir, es constante.
El bucle se ejecuta \( p \) veces, en la \( k-\textrm{ésima} \) de las cuales calcula:
1) El sucesor de \( k \), se hace en un tiempo \( O(\left |{k}\right | \)
2) El producto \( m\cdot{k} \), que se puede hacer en \( O(\left |{m}\right |\cdot{\left |{k}\right |})=O(\left |{(k-1)!}\right |\cdot{\left |{k}\right |}) \)
3) El valor lógico de mayor_o_igual(m,n), que se hace en \( O(min(\left |{m}\right |,\left |{n}\right |))\subseteq{O(\left |{n}\right |)} \)
En total, el número de operaciones que deben hacerse es del orden de:
\( O(\left |{1}\right |+|2|+...+|p|+|1|\cdot{}|0!|+|2|\cdot{}|1!|+...+|p|\cdot{}|(p-1)!|+\underbrace{|n|+...+|n|}_{p\textrm{ veces}})=O(|1|\cdot{}|0!|+|2|\cdot{}|1!|+...+|p|\cdot{}|(p-1)!|+p\cdot{\left |{n}\right |}) \)
Y básicamente, hasta aquí he llegado. He intentado cosas pero no me ha salido nada demasiado interesante, como por ejemplo, utilizar los teoremas de Stolz y de Stirling para calcular la parte principal de \( |1|\cdot{}|0!|+|2|\cdot{}|1!|+...+|p|\cdot{}|(p-1)!|\sim{}\log(1)\log(0!)+\log(2)\log(1!)+...+\log(p)\log((p-1)!) \), pero no lo he acabado de sacar. Tampoco creo que vayan por ahí los tiros, ya que no veo cómo se puede dejar después todo en función sólo de \( \left |{n}\right | \).
¿Alguien me podría proporcionar algunas recomendaciones o directrices para resolver problemas de este estilo? No acabo de pillarles el "tranquillo".
Agradezco de antemano cualquier tipo de comentario y de ayuda. Un saludo.