Si [matemática] f (n) [/ matemática] [matemática] \ en O (n) [/ matemática] y [matemática] g (n) \ en O (n) [/ matemática], es [matemática] f ( g (n)) \ en O (n ^ 2)? [/ matemáticas]

La respuesta es (1) [matemáticas] f (g (n)) \ en O (n) [/ matemáticas] también. La intuición detrás de esto es que si [matemática] f [/ matemática] y [matemática] g [/ matemática] están asintóticamente delimitadas por una función lineal, entonces su composición también lo es.

Pero tratemos de demostrarlo matemáticamente y volvamos a la definición formal de la notación “Big O” para demostrarlo. Trataré de describir en detalle el proceso de pensamiento a continuación.

La definición es, si [matemática] f [/ matemática] y [matemática] h [/ matemática] son ​​dos funciones definidas en algún subconjunto de los números reales (aquí, ya que usa la letra [matemática] n [/ matemática], asumiremos los enteros): [matemáticas] f (n) \ en O (h (n)) [/ matemáticas] si y solo si podemos encontrar una constante positiva [matemáticas] M [/ matemáticas] y un valor [ math] n_0 [/ math] tal que, por cada [math] n> n_0 [/ math] tenemos [math] f (n) <M h (n). [/ math]

¿Qué sabemos?

  • (a) Sabemos que [matemáticas] f (n) \ en O (n) [/ matemáticas]. Por lo tanto, significa que podemos encontrar [matemática] M_0, n_0 [/ matemática] tal que por cada [matemática] n [/ matemática] mayor que [matemática] n_0 [/ matemática], [matemática] f (n) <M_0 n [/matemáticas]
  • (b) También sabemos que [matemática] g (n) \ en O (n) [/ matemática], por lo que podemos encontrar [matemática] M_1, n_1 [/ matemática] tal que por cada [matemática] n [/ matemática ] mayor que [matemáticas] n_1 [/ matemáticas], [matemáticas] g (n) <M_1 n [/ matemáticas]

Para probar (1) , necesitamos encontrar [matemática] M_2, n_2 [/ matemática] de modo que por cada [matemática] n [/ matemática] mayor que [matemática] n_2 [/ matemática] tengamos [matemática] f (g (n)) <M_2 n [/ matemáticas]. ¿Cómo combinamos los dos puntos anteriores para encontrar [matemáticas] M_2 [/ matemáticas] y [matemáticas] n_2 [/ matemáticas]?

La viñeta (a) nos dice que, para cualquier valor de [matemática] n ‘[/ matemática] tal que [matemática] n’> n_0, f (n ‘) <M_0 n' [/ matemática], ¿verdad? Como estamos componiendo [matemática] f [/ matemática] y [matemática] g [/ matemática], los valores de [matemática] n '[/ matemática] que nos interesan son de la forma [matemática] n' = g (n )[/matemáticas]. Por lo tanto, debemos pensar qué valores puede tomar [math] g [/ math] y cómo se relacionan con [math] n_0 [/ math] para diferentes valores de [math] n [/ math].

Tomemos cualquier [matemática] n> max (n_1, n_0) [/ matemática] (es decir, [matemática] n> n_0 [/ matemática] y [matemática] n> n_1 [/ matemática]). Tenemos dos casos:

  1. [matemáticas] g (n) <n_0 [/ matemáticas]. Si [math] f [/ math], como se afirma aquí, es una función de enteros, entonces solo puede tomar un número finito de valores entre [math] 0 [/ math] y [math] n_0 [/ math]. Y cualquier número finito de valores tiene un valor máximo. Llamémoslo [matemáticas] K [/ matemáticas] aquí. En este caso, siempre tenemos [matemáticas] f (g (n)) = 1 [/ matemática] se deduce que [matemática] f (g (n)) <K <K n [/ matemática] entonces [matemática] f (g (n)) <Kn [/ matemáticas].
    Nota: si [math] f [/ math] es una función de números reales, entonces las declaraciones anteriores todavía funcionan siempre que [math] f [/ math] esté acotado a mi valor máximo antes de [math] n_0 [/ math] .
  2. [matemáticas] g (n)> n_0 [/ matemáticas]. Lo cual, por el punto (a) , asegura [matemática] f (g (n)) <M_0 g (n) [/ matemática]. Luego, por la viñeta (b) , ya que también asumimos [matemática] n> n_1 [/ matemática], [matemática] g (n) <M_1 n [/ matemática] por lo que se deduce que [matemática] f (g (n) ) <M_0 M_1 n [/ math].

Los dos puntos anteriores aseguran que, para cualquier [matemática] n> máx (n_1, n_0) [/ matemática], tendremos [matemática] f (g (n)) <máx. (M_0 M_1, K) n [/ matemáticas]. Y esto, por definición, significa que [matemáticas] f (g (n)) \ en O (n) [/ matemáticas] – tomar [matemáticas] n_2 = max (n_1, n_0) [/ matemáticas] y [matemáticas] M_2 = max (M_0 M_1, K) [/ matemáticas].

[Editar: mi primera respuesta fue incorrecta, ¡gracias Henrique Gomes y Ed Itz por hacerme repensarlo!]

Sí, y en la mayoría de los casos O (k) * O (l) = O (kl)

Digamos que doThing () toma n tiempo, luego un ciclo que itera de 1 a n llamando a doThing () cada vez tomaría O (n ^ 2) tiempo porque llama a una función O (n) n veces.

Ejemplo:
Trabajas para una empresa que tiene n computadoras. Haces una lista de las computadoras y las escribes en una computadora, te lleva O (n) tiempo. Además, escribir una sola palabra en todas las computadoras te llevaría O (n) tiempo, porque necesitarías hacerlo en n computadoras.
Escribir una lista de todas las computadoras, en todas las computadoras, le llevaría O (n) * O (n) tiempo, que es O (n ^ 2)

No . También es [matemáticas] O (n) [/ matemáticas].

Puede parecer contradictorio, pero piénselo. Si tanto [math] f [/ math] como [math] g [/ math] escalan linealmente, correr uno tras otro también debería escalar linealmente.

More Interesting

¿Cuáles son los tipos de algoritmos más básicos y complicados?

¿Cuál es un buen enfoque para resolver este problema Problema - 118D - Codeforces?

¿Cómo funciona el algoritmo de clasificación de páginas de Google?

¿Qué estructura de datos sería mejor para encontrar el número de estudiantes dentro de un rango de altura dado de manera escalable?

¿Qué nuevos algoritmos ha creado Google?

Cómo evaluar el efecto del programa de seguridad vial en el comportamiento después de 7 años de implementación si no hay datos de referencia

¿Cuál es el papel de la memoria de montón?

Cómo implementar un hashing sensible a la localidad

¿Cuál es el mejor algoritmo de extracción en primer plano de escenas dinámicas, donde el fondo también puede cambiar (debido a las vibraciones de la cámara o los detalles en movimiento)?

¿Existe un mapeo limpio de los ordenamientos de N objetos en la recta numérica?

¿Debería un principiante construir cosas y contribuir a proyectos de código abierto antes de aprender algoritmos?

¿Cuál es el enfoque de este problema algorítmico a continuación?

Cómo contar el número de enteros palindrómicos dentro de un rango [A, B] donde A y B pueden ser de hasta 10 ^ 17

Me resultó difícil entender los algoritmos de clasificación. ¡Cuando profundizo en los algoritmos, siento que mi mente se bloquea! ¿Qué debo hacer para sentirme cómodo con los algoritmos?

¿Cuál es la diferencia entre los métodos de búsqueda y los algoritmos utilizados por los motores de búsqueda de Google, Yahoo y Bing? ¿Cómo lo explicarías de una manera simple?