¿Cómo escribiría una función que encuentre la entrada máxima n tal que f (n) <c en el tiempo O (lg n)?

Tu pregunta no está muy bien definida.

En primer lugar, puede construir fácilmente un contraejemplo de lo que está preguntando. Suponga que el “número muy grande [matemática] c [/ matemática]” es [matemática] 1000 [/ matemática]. Luego, ajuste [matemática] f (n) = 1001. [/ matemática] Puede ver que independientemente de “cuán grande” sea su [matemática] n [/ matemática], la función [matemática] f [/ matemática] nunca satisfará [matemáticas] (n) <n [/ matemáticas]

Ahora, algunas funciones son especiales, por ejemplo, si una función está aumentando estrictamente , entonces puede aplicar un método similar a la búsqueda binaria en el intervalo [matemáticas] [1, c] [/ matemáticas]. Lo haces de la siguiente manera:

Deje [math] q = \ left \ lceil {\ frac {1 + c} {2}} \ right \ rceil [/ math]

Verifique si [matemáticas] f (q) <c [/ matemáticas] o no. Si [matemática] f (q) <c [/ matemática], entonces verifica el intervalo [q, c] pero si no es así, verifica el intervalo [1, q]. ¡Sigue repitiendo este proceso hasta que su intervalo tenga solo un número, y haya encontrado su n!

Dado que sigue dividiendo el intervalo a la mitad constantemente, esencialmente lo está haciendo en el peor de los casos [math] \ log_2 (c-1) [/ math] operaciones de división. Dentro de cada uno de ellos, solo está verificando una condición que requiere tiempo constante independientemente de cuán grande sea [math] q [/ math]. Por lo tanto, su tiempo de ejecución es [math] O (\ log_2 (c-1)) \ times O (1)) [/ math] o simplemente [math] O (\ log (c)) [/ math]

Sí, creo que una búsqueda binaria de [1, C] debería funcionar. Este rango es solo un ejemplo, dependerá del tipo de función que tenga, pero supongo que tiene la idea.