1. Bucles sencillos

Ejercicio 1

function ejercicio1(int n)
    for (int i = 0; i < n; i += 3)          // Línea 1
        print(i)                            // Línea 2
    end_for                                 // Línea 3
    return n                                // Línea 4
end_function

1.1 Cálculo del stem cc4152a1ba8a0ec113e9f2062a489b7d

El tiempo de ejecución de la función viene dado por la suma del tiempo de ejecución del bucle y el tiempo de ejecución de la operación de retorno:

$$T(n) = T_{bucle}(n) + T_{return}(n)$$

Donde:

  • stem 27d001dc97ddb30aac93a9ed99cf9bda es el tiempo de ejecución del bucle (líneas 1-3).

  • stem 321b5000f6dcac69d145901ed0074fca es el tiempo de ejecución de la línea 4.

Como stem 7c6789c89c9c06ba4c6394d669cd2938, donde stem 988584bba6844388f07ea45b7132f61c es el tiempo constante de la operación de retorno:

$$T(n) = T_{bucle}(n) + c_1$$

Para calcular stem 27d001dc97ddb30aac93a9ed99cf9bda vamos a reescribir el bucle de la siguiente manera:

    for (int i = 0; i <= n - 1; i += 3)      // Línea 1
        print(i)                             // Línea 2
    end_for                                  // Línea 3

Hemos reescrito la condición original stem 30bd590c5fcaf0f918dead3b836ae52a como stem c96d1a3ff278a01c412864e957743fab para identificar el límite superior del intervalo, lo que simplifica la construcción del sumatorio.

Para determinar el número de iteraciones del bucle (líneas 1-3), analizamos la progresión de los valores que toma la variable stem 77a3b857d53fb44e33b53e4c8b68351a:

  • Límite inferior: stem 40d975611073395a2729feccad9e91b3

  • Límite superior: stem c96d1a3ff278a01c412864e957743fab

  • Incremento: 3 en cada paso (stem 26f5bfe115628042b2f97d4983e1c403)

Dado que el bucle no se incrementa de 1 en 1, calculamos el número total de iteraciones aplicando la fórmula de los términos de una progresión aritmética:

$$\text{Número de iteraciones} = \frac{\text{Límite superior} - \text{Límite inferior}}{\text{Incremento}} + 1$$

Sustituyendo los valores de nuestro bucle:

$$\text{Número de iteraciones} = \frac{(n - 1) - 0}{3} + 1$$

Podemos expresar el tiempo de ejecución del bucle como un sumatorio donde el índice recorre desde la primera hasta la última iteración:

$$T_{bucle}(n) = \sum_{i=1}^{\lfloor \frac{n - 1}{3} + 1 \rfloor} c_2$$

Donde stem e355414b8774603011922d600510b1df es el tiempo constante de las operaciones dentro del bucle. Resolviendo el sumatorio obtenemos:

$$T_{bucle}(n) \leq c_2 \cdot \left( \frac{n - 1}{3} + 1 \right)$$

Simplificando los términos de la expresión:

$$T_{bucle}(n) \leq c_2 \cdot \left( \frac{n}{3} - \frac{1}{3} + 1 \right) = \frac{c_2}{3}n + \frac{2{c_2}}{3}$$

Sustituyendo en la expresión original:

$$T(n) = T_{bucle}(n) + c_1 = \frac{c_2}{3}n + \frac{2{c_2}}{3} + c_1$$

1.2 Cálculo del orden de complejidad stem 1f08ccc9cd7309ba1e756c3d9345ad9f

En el análisis asintótico, despreciamos las constantes multiplicativas y los términos de menor orden:

  1. El término de mayor orden es stem 55a049b8f161ae7cfeb0197d75aff967.

  2. Las constantes stem ce5b12c4fb66bdff7da8ec35c1fae7ff, stem e5b7571f14b88c9310efd0cb2bd85b5b y stem 988584bba6844388f07ea45b7132f61c no afectan al crecimiento asintótico.

El algoritmo tiene una complejidad lineal, ya que el número de operaciones crece de manera directamente proporcional a stem 55a049b8f161ae7cfeb0197d75aff967.

$$T(n) \in \mathcal{O}(n)$$

Ejercicio 2

function ejercicio2(int n)
    for (int i = 0; i < n/2; i += 5)        // Línea 1
        print(i)                            // Línea 2
    end_for                                 // Línea 3
    return n                                // Línea 4
end_function

2.1 Cálculo del stem cc4152a1ba8a0ec113e9f2062a489b7d

El tiempo de ejecución de la función viene dado por la suma del tiempo de ejecución del bucle y el tiempo de ejecución de la operación de retorno:

$$T(n) = T_{bucle}(n) + T_{return}(n)$$

Donde:

  • stem 27d001dc97ddb30aac93a9ed99cf9bda es el tiempo de ejecución del bucle (líneas 1-3).

  • stem 321b5000f6dcac69d145901ed0074fca es el tiempo de ejecución de la línea 4.

Como stem 7c6789c89c9c06ba4c6394d669cd2938, donde stem 988584bba6844388f07ea45b7132f61c es el tiempo constante de la operación de retorno:

$$T(n) = T_{bucle}(n) + c_1$$

Para calcular stem 27d001dc97ddb30aac93a9ed99cf9bda vamos a reescribir el bucle de la siguiente manera:

    for (int i = 0; i <= (n/2) - 1; i += 5)  // Línea 1
        print(i)                             // Línea 2
    end_for                                  // Línea 3

Hemos reescrito la condición original stem ef16cca8bdebacef29b2044257826e80 como stem a79d8e50c4e950175fbcadf3b4481729 para identificar el límite superior del intervalo, lo que simplifica la construcción del sumatorio.

Para determinar el número de iteraciones del bucle (líneas 1-3), analizamos la progresión de los valores que toma la variable stem 77a3b857d53fb44e33b53e4c8b68351a:

  • Límite inferior: stem 40d975611073395a2729feccad9e91b3

  • Límite superior: stem a79d8e50c4e950175fbcadf3b4481729

  • Incremento: 5 en cada paso (stem cf685ae403928fea2fa3ac1ed4f5a0be)

Dado que el bucle no se incrementa de 1 en 1, calculamos el número total de iteraciones aplicando la fórmula de los términos de una progresión aritmética:

$$\text{Número de iteraciones} = \frac{\text{Límite superior} - \text{Límite inferior}}{\text{Incremento}} + 1$$

Sustituyendo los valores de nuestro bucle:

$$\text{Número de iteraciones} = \frac{(n/2 - 1) - 0}{5} + 1$$

Podemos expresar el tiempo de ejecución del bucle como un sumatorio donde el índice recorre desde la primera hasta la última iteración:

$$T_{bucle}(n) = \sum_{i=1}^{\lfloor \frac{n/2 - 1}{5} + 1 \rfloor} c_2$$

Donde stem e355414b8774603011922d600510b1df es el tiempo constante de las operaciones dentro del bucle. Resolviendo el sumatorio obtenemos:

$$T_{bucle}(n) \leq c_2 \cdot \left( \frac{n/2 - 1}{5} + 1 \right)$$

Simplificando los términos de la expresión:

$$T_{bucle}(n) \leq c_2 \cdot \left( \frac{n}{10} - \frac{1}{5} + 1 \right) = \frac{c_2}{10}n + \frac{4{c_2}}{5}$$

Sustituyendo en la expresión original:

$$T(n) = T_{bucle}(n) + c_1 = \frac{c_2}{10}n + \frac{4{c_2}}{5} + c_1$$

2.2 Cálculo del orden de complejidad stem 1f08ccc9cd7309ba1e756c3d9345ad9f

En el análisis asintótico, despreciamos las constantes multiplicativas y los términos de menor orden:

  1. El término de mayor orden es stem 55a049b8f161ae7cfeb0197d75aff967.

  2. Las constantes stem fa1afbf8145cca9263f02c6a14e91900, stem a79836706cb00119cf9d03bd4e8e6eba y stem 988584bba6844388f07ea45b7132f61c no afectan al crecimiento asintótico.

El algoritmo tiene una complejidad lineal, ya que el número de operaciones crece de manera directamente proporcional a stem 55a049b8f161ae7cfeb0197d75aff967.

$$T(n) \in \mathcal{O}(n)$$

Ejercicio 3

function ejercicio3(int n)
    for (int i = n; i > 0; i--)             // Línea 1
        print(i)                            // Línea 2
    end_for                                 // Línea 3
    return n                                // Línea 4
end_function

3.1 Cálculo del stem cc4152a1ba8a0ec113e9f2062a489b7d

El tiempo de ejecución de la función viene dado por la suma del tiempo de ejecución del bucle y el tiempo de ejecución de la operación de retorno:

$$T(n) = T_{bucle}(n) + T_{return}(n)$$

Donde:

  • stem 27d001dc97ddb30aac93a9ed99cf9bda es el tiempo de ejecución del bucle (líneas 1-3).

  • stem 321b5000f6dcac69d145901ed0074fca es el tiempo de ejecución de la línea 4.

Como stem 7c6789c89c9c06ba4c6394d669cd2938, donde stem 988584bba6844388f07ea45b7132f61c es el tiempo constante de la operación de retorno:

$$T(n) = T_{bucle}(n) + c_1$$

Para determinar el número de iteraciones del bucle (líneas 1-3), analizamos la progresión de los valores que toma la variable stem 77a3b857d53fb44e33b53e4c8b68351a:

  • Valor inicial: stem 40e1326bf2578fe754a359bc8dd831d0

  • Condición: stem 9a83ceb78f1e9cc5a4a53d6035d25f5e

  • Decremento: 1 en cada paso (stem e1cb74f5ebdf14b411544e6803af96cd)

La lógica en bucles con decremento es idéntica a la de los bucles con incremento. La siguiente fórmula nos permite calcular el número de iteraciones basándonos en los límites del intervalo:

$$\text{Número de iteraciones} = \frac{\text{Límite superior (inicio)} - \text{Límite inferior (fin)}}{\text{Decremento}} + 1$$

Sustituyendo los valores de nuestro bucle:

$$\text{Iteraciones} = \frac{n - 1}{1} + 1 = n$$

Podemos expresar el tiempo de ejecución del bucle como un sumatorio donde el índice recorre desde la primera hasta la última iteración:

$$T_{bucle}(n) = \sum_{i=1}^{n} c_2$$

Donde stem e355414b8774603011922d600510b1df es el tiempo constante de las operaciones dentro del bucle. Resolviendo el sumatorio obtenemos:

$$T_{bucle}(n) = n \cdot c_2$$

Sustituyendo en la expresión original:

$$T(n) = T_{bucle}(n) + c_1 = c_2 \cdot n + c_1$$

3.2 Cálculo del orden de complejidad stem 1f08ccc9cd7309ba1e756c3d9345ad9f

Para determinar el orden de complejidad, realizamos el análisis asintótico de la expresión stem 4986187caca0eadfb89f0e73a199f86e:

  1. Descartamos los términos de menor orden. La constante stem 988584bba6844388f07ea45b7132f61c es un término de orden inferior comparado con stem afcf927479b4c932261f1c53bb1aface.

  2. Descartamos las constantes multiplicativas. La constante stem e355414b8774603011922d600510b1df no afecta al crecimiento asintótico de la función.

El término dominante es stem 55a049b8f161ae7cfeb0197d75aff967, por lo que el algoritmo tiene una complejidad lineal.

$$T(n) \in \mathcal{O}(n)$$

Ejercicio 4

function ejercicio4(int n)
    for (int i = 1; i <= n; i = i * 2)      // Línea 1
        print(i)                            // Línea 2
    end_for                                 // Línea 3
    return n                                // Línea 4
end_function

4.1 Cálculo del stem cc4152a1ba8a0ec113e9f2062a489b7d

El tiempo de ejecución de la función viene dado por la suma del tiempo de ejecución del bucle y el tiempo de ejecución de la operación de retorno:

$$T(n) = T_{bucle}(n) + T_{return}(n)$$

Donde:

  • stem 27d001dc97ddb30aac93a9ed99cf9bda es el tiempo de ejecución del bucle (líneas 1-3).

  • stem 321b5000f6dcac69d145901ed0074fca es el tiempo de ejecución de la línea 4.

Como stem 7c6789c89c9c06ba4c6394d669cd2938, donde stem 988584bba6844388f07ea45b7132f61c es el tiempo constante de la operación de retorno:

$$T(n) = T_{bucle}(n) + c_1$$

Para determinar el número de iteraciones del bucle (líneas 1-3), analizamos la progresión geométrica de los valores que toma la variable stem 77a3b857d53fb44e33b53e4c8b68351a:

  • Iteración 0: stem eb4a708c24da27f084e14bab83423dfb

  • Iteración 1: stem fff69b32ccf6f685b2dd5300fb909eba

  • Iteración 2: stem d2797108c08fceb78e131760dd3f1b6e

  • Iteración k: stem a42e3749ca1cbe07a5e2a34a5b746910

El bucle continúa mientras se cumpla la condición stem 68827e01bb2553e7e0fd18d88f85396d. Para despejar el número de iteraciones en la última vuelta (stem 63bb9849783d01d91403bc9a5fea12a2), resolvemos la siguiente inecuación:

$$\begin{aligned}
&2^k \le n \\
&\log_2(2^k) \le \log_2(n) \\
&k \le \log_2 n
\end{aligned}$$

Por las propiedades de los logaritmos stem 35364b3dbcf48c57219f0f13d582583a.

El número total de iteraciones es stem 8a7ee027c9f8b6613406f7221524b3a6, contando desde la primera iteración stem 8df03261b67972f1573d96bd4fcb462e hasta la última stem b05aab0d8c8ece743c788f7ff538b926.

Podemos expresar el tiempo de ejecución del bucle como un sumatorio donde el índice stem 63bb9849783d01d91403bc9a5fea12a2 representa cada iteración:

$$T_{bucle}(n) = \sum_{k=0}^{\lfloor \log_2 n \rfloor} c_2$$

Donde stem e355414b8774603011922d600510b1df es el tiempo constante de las operaciones dentro del bucle. Resolviendo el sumatorio obtenemos:

$$T_{bucle}(n) = c_2 \cdot (\lfloor \log_2 n \rfloor + 1)$$

Sustituyendo en la expresión original:

$$T(n) = T_{bucle}(n) + c_1 = c_2 \cdot (\lfloor \log_2 n \rfloor + 1) + c_1$$

4.2 Cálculo del orden de complejidad stem 0d4b7f5b66e994af32a32cfa26868d53

Para determinar el orden de complejidad, realizamos el análisis asintótico:

  1. Descartamos los términos de menor orden. Las constantes stem 988584bba6844388f07ea45b7132f61c y stem e355414b8774603011922d600510b1df son términos de orden inferior comparados con stem 68f1bbb87512454065f67d6f1803da9e.

  2. Descartamos las constantes multiplicativas. Las constantes no afectan al crecimiento asintótico.

  3. Cambio de base del logaritmo. Todas las funciones logarítmicas pertenecen al mismo orden de complejidad, independientemente de la base.

El término dominante es stem 6931c25b0d6a07c96e4160eac934c79d, por lo que el algoritmo tiene una complejidad logarítmica.

$$T(n) \in \mathcal{O}(\log n)$$

Ejercicio 5

function ejercicio5(int n)
    for (int i = n; i >= 1; i = i / 2)      // Línea 1
        print(i)                            // Línea 2
    end_for                                 // Línea 3
    return n                                // Línea 4
end_function

5.1 Cálculo del stem cc4152a1ba8a0ec113e9f2062a489b7d

El tiempo de ejecución de la función viene dado por la suma del tiempo de ejecución del bucle y el tiempo de ejecución de la operación de retorno:

$$T(n) = T_{bucle}(n) + T_{return}(n)$$

Donde:

  • stem 27d001dc97ddb30aac93a9ed99cf9bda es el tiempo de ejecución del bucle (líneas 1-3).

  • stem 321b5000f6dcac69d145901ed0074fca es el tiempo de ejecución de la línea 4.

Como stem 7c6789c89c9c06ba4c6394d669cd2938, donde stem 988584bba6844388f07ea45b7132f61c es el tiempo constante de la operación de retorno:

$$T(n) = T_{bucle}(n) + c_1$$

Para determinar el número de iteraciones del bucle (líneas 1-3), analizamos la progresión geométrica decreciente de los valores que toma la variable stem 77a3b857d53fb44e33b53e4c8b68351a:

  • Iteración 0: stem cae99e12a10c48aa7830d4a56c61e19a

  • Iteración 1: stem 1f468b5e4a517c1725f7d60d4ba426fc

  • Iteración 2: stem 6886df031c4d30f5b90cf08700f080ab

  • Iteración k: stem 33f3361e823c4b5242116edb6c451006

El bucle continúa mientras se cumpla la condición stem 6f0c192d1e61bba4835b4e65408d71c9. Para despejar el número de iteraciones en la última vuelta (stem 63bb9849783d01d91403bc9a5fea12a2), resolvemos la siguiente inecuación:

$$\begin{aligned}
&\frac{n}{2^k} \ge 1 \\
&n \ge 2^k \\
&\log_2(n) \ge \log_2(2^k) \\
&\log_2 n \ge k
\end{aligned}$$

Por las propiedades de los logaritmos stem 35364b3dbcf48c57219f0f13d582583a.

El número total de iteraciones es stem 8a7ee027c9f8b6613406f7221524b3a6, contando desde la primera iteración stem 8df03261b67972f1573d96bd4fcb462e hasta la última stem b05aab0d8c8ece743c788f7ff538b926.

Podemos expresar el tiempo de ejecución del bucle como un sumatorio donde el índice stem 63bb9849783d01d91403bc9a5fea12a2 representa cada iteración:

$$T_{bucle}(n) = \sum_{k=0}^{\lfloor \log_2 n \rfloor} c_2$$

Donde stem e355414b8774603011922d600510b1df es el tiempo constante de las operaciones dentro del bucle. Resolviendo el sumatorio obtenemos:

$$T_{bucle}(n) = c_2 \cdot (\lfloor \log_2 n \rfloor + 1)$$

Sustituyendo en la expresión original:

$$T(n) = T_{bucle}(n) + c_1 = c_2 \cdot (\lfloor \log_2 n \rfloor + 1) + c_1$$

5.2 Cálculo del orden de complejidad stem 0d4b7f5b66e994af32a32cfa26868d53

Para determinar el orden de complejidad, realizamos el análisis asintótico:

  1. Descartamos los términos de menor orden. Las constantes stem 988584bba6844388f07ea45b7132f61c y stem e355414b8774603011922d600510b1df son términos de orden inferior comparados con stem 68f1bbb87512454065f67d6f1803da9e.

  2. Descartamos las constantes multiplicativas. Las constantes no afectan al crecimiento asintótico.

  3. Cambio de base del logaritmo. Todas las funciones logarítmicas pertenecen al mismo orden de complejidad, independientemente de la base.

El término dominante es stem 6931c25b0d6a07c96e4160eac934c79d, por lo que el algoritmo tiene una complejidad logarítmica.

$$T(n) \in \mathcal{O}(\log n)$$

Ejercicio 6

function ejercicio6(int n)
    for (int i = 1; i <= n; i = i * 3)      // Línea 1
        print(i)                            // Línea 2
    end_for                                 // Línea 3
    return n                                // Línea 4
end_function

6.1 Cálculo del stem cc4152a1ba8a0ec113e9f2062a489b7d

El tiempo de ejecución de la función viene dado por la suma del tiempo de ejecución del bucle y el tiempo de ejecución de la operación de retorno:

$$T(n) = T_{bucle}(n) + T_{return}(n)$$

Donde:

  • stem 27d001dc97ddb30aac93a9ed99cf9bda es el tiempo de ejecución del bucle (líneas 1-3).

  • stem 321b5000f6dcac69d145901ed0074fca es el tiempo de ejecución de la línea 4.

Como stem 7c6789c89c9c06ba4c6394d669cd2938, donde stem 988584bba6844388f07ea45b7132f61c es el tiempo constante de la operación de retorno:

$$T(n) = T_{bucle}(n) + c_1$$

Para determinar el número de iteraciones del bucle (líneas 1-3), analizamos la progresión geométrica de los valores que toma la variable stem 77a3b857d53fb44e33b53e4c8b68351a:

  • Iteración 0: stem c9153dbfecbe43c04c31744052d12d4d

  • Iteración 1: stem 2304bfed67ee90467fdcab60770eea0f

  • Iteración 2: stem 3c47555cd0a019537a983bcd43de18fd

  • Iteración k: stem d3d3fff0db626b2bf3fef876c38690cf

El bucle continúa mientras se cumpla la condición stem 68827e01bb2553e7e0fd18d88f85396d. Para despejar el número de iteraciones en la última vuelta (stem 63bb9849783d01d91403bc9a5fea12a2), resolvemos la siguiente inecuación:

$$\begin{aligned}
&3^k \le n \\
&\log_3(3^k) \le \log_3(n) \\
&k \le \log_3 n
\end{aligned}$$

Por las propiedades de los logaritmos stem 35364b3dbcf48c57219f0f13d582583a.

El número total de iteraciones es stem 105e36ed37428e3a6ad2ffcbe79fd401, contando desde la primera iteración stem 8df03261b67972f1573d96bd4fcb462e hasta la última stem 8c53fd5bf7af38060ba0df4ca6c1fd4f.

Podemos expresar el tiempo de ejecución del bucle como un sumatorio donde el índice stem 63bb9849783d01d91403bc9a5fea12a2 representa cada iteración:

$$T_{bucle}(n) = \sum_{k=0}^{\lfloor \log_3 n \rfloor} c_2$$

Donde stem e355414b8774603011922d600510b1df es el tiempo constante de las operaciones dentro del bucle. Resolviendo el sumatorio obtenemos:

$$T_{bucle}(n) = c_2 \cdot (\lfloor \log_3 n \rfloor + 1)$$

Sustituyendo en la expresión original:

$$T(n) = T_{bucle}(n) + c_1 = c_2 \cdot (\lfloor \log_3 n \rfloor + 1) + c_1$$

6.2 Cálculo del orden de complejidad stem 0d4b7f5b66e994af32a32cfa26868d53

Para determinar el orden de complejidad, realizamos el análisis asintótico:

  1. Descartamos los términos de menor orden. Las constantes stem 988584bba6844388f07ea45b7132f61c y stem e355414b8774603011922d600510b1df son términos de orden inferior comparados con stem 3280436a89dcfab72b88136f0fa9eec8.

  2. Descartamos las constantes multiplicativas. Las constantes no afectan al crecimiento asintótico.

  3. Cambio de base del logaritmo. Todas las funciones logarítmicas pertenecen al mismo orden de complejidad, independientemente de la base (recordemos que stem b41ad8a88ac5a9d26c2ada9d03a6642c, siendo stem 5589e28214178ef0ab200135befa4b3c una constante).

El término dominante es stem 6931c25b0d6a07c96e4160eac934c79d, por lo que el algoritmo tiene una complejidad logarítmica.

$$T(n) \in \mathcal{O}(\log n)$$

2. Bucles anidados independientes

Ejercicio 7

function ejercicio7(int n)
    for (int i = 0; i < n/2; i++)           // Línea 1
        for(int j = 0; j < n/2; j++)        // Línea 2
            print(i + j)                    // Línea 3
        end_for                             // Línea 4
    end_for                                 // Línea 5
    return n                                // Línea 6
end_function

7.1 Cálculo del stem cc4152a1ba8a0ec113e9f2062a489b7d

El tiempo de ejecución de la función viene dado por la suma del tiempo de ejecución del bucle anidado y el tiempo de ejecución de la operación de retorno:

$$T(n) = T_{bucle}(n) + T_{return}(n)$$

Como stem 7c6789c89c9c06ba4c6394d669cd2938, la expresión es:

$$T(n) = T_{bucle}(n) + c_1$$

Para calcular stem 27d001dc97ddb30aac93a9ed99cf9bda, analizamos la estructura anidada. El tiempo total es la suma de las ejecuciones del bucle interno multiplicada por las iteraciones del bucle externo.

Para determinar el número de iteraciones de ambos bucles:

  • Bucle externo (i): Va de stem 29632a9bf827ce0200454dd32fc3be82 a stem 1a58321b86708c45d4c924c4160952d7. El número de iteraciones es stem 9d2caaecfdd59c493baf322c918fb585.

  • Bucle interno (j): Va de stem 29632a9bf827ce0200454dd32fc3be82 a stem 1a58321b86708c45d4c924c4160952d7. El número de iteraciones es stem 9d2caaecfdd59c493baf322c918fb585.

Podemos expresar el tiempo de ejecución total como un sumatorio anidado:

$$T_{bucle}(n) = \sum_{i=1}^{\lfloor n/2 \rfloor} \sum_{j=1}^{\lfloor n/2 \rfloor} c_2$$

Donde stem e355414b8774603011922d600510b1df es el tiempo constante de la operación dentro del bucle interno. Resolviendo el sumatorio interno:

$$\sum_{j=1}^{\lfloor n/2 \rfloor} c_2 = \lfloor n/2 \rfloor \cdot c_2$$

Sustituyendo en el sumatorio externo:

$$T_{bucle}(n) = \sum_{i=1}^{\lfloor n/2 \rfloor} (\lfloor n/2 \rfloor \cdot c_2) = \lfloor n/2 \rfloor \cdot \lfloor n/2 \rfloor \cdot c_2 \approx \frac{n^2}{4} c_2$$

Sustituyendo en la expresión original:

$$T(n) = \frac{c_2}{4}n^2 + c_1$$

7.2 Cálculo del orden de complejidad stem 3987120c67ed5a9162aa9841b531c3a9

Para determinar el orden de complejidad, realizamos el análisis asintótico:

  1. Descartamos los términos de menor orden. La constante stem 988584bba6844388f07ea45b7132f61c es de orden inferior frente a stem 021273d50c6ff03efebda428e9e42d77.

  2. Descartamos las constantes multiplicativas. El factor stem 0102d56d85dbe7f902457843ac3135e7 no afecta al crecimiento asintótico.

El término dominante es stem 021273d50c6ff03efebda428e9e42d77, por lo que el algoritmo tiene una complejidad cuadrática.

$$T(n) \in \mathcal{O}(n^2)$$

Ejercicio 8

function ejercicio8(int n)
    int m = 3000                            // Línea 1
    for (int i = 0; i < n/2; i++)           // Línea 2
        for(int j = 0; j < m * 1000; j++)   // Línea 3
            print(i + j + m)                // Línea 4
        end_for                             // Línea 5
    end_for                                 // Línea 6
    return n                                // Línea 7
end_function

8.1 Cálculo del stem cc4152a1ba8a0ec113e9f2062a489b7d

El tiempo de ejecución de la función viene dado por la suma del tiempo de ejecución de la inicialización, el bucle anidado y el retorno:

$$T(n) = T_{init}(n) + T_{bucle}(n) + T_{return}(n)$$

Donde stem a21d49011753b74adf8231a7bafbd35b y stem 7c6789c89c9c06ba4c6394d669cd2938. La expresión se simplifica a:

$$T(n) = c_0 + T_{bucle}(n) + c_1$$

Para calcular stem 27d001dc97ddb30aac93a9ed99cf9bda, analizamos las iteraciones de cada bucle:

  • Bucle externo (i): Va de stem 29632a9bf827ce0200454dd32fc3be82 a stem 1a58321b86708c45d4c924c4160952d7. El número de iteraciones es stem 9d2caaecfdd59c493baf322c918fb585.

  • Bucle interno (j): Va de stem 29632a9bf827ce0200454dd32fc3be82 a stem 1f40f00c59f8192d608a38269e8920fe. Como stem de9ec0cd01fe0e8be0e52cbbb1e7aa6f, el número de iteraciones es stem 9c28ebf64e8ad189f0bfea5eff11af3f.

Es muy importante observar que el número de iteraciones del bucle interno no depende de stem 55a049b8f161ae7cfeb0197d75aff967. Por tanto, el tiempo de ejecución del bucle interno es una constante stem 610783cd1d1c7b5bafd238cb90a0b952.

Podemos expresar el tiempo de ejecución del bucle total como:

$$T_{bucle}(n) = \sum_{i=1}^{\lfloor n/2 \rfloor} C = \lfloor n/2 \rfloor \cdot C$$

Sustituyendo los valores constantes:

$$T_{bucle}(n) = \lfloor n/2 \rfloor \cdot (3,000,000 \cdot c_2)$$

La expresión final de stem cc4152a1ba8a0ec113e9f2062a489b7d es:

$$T(n) = \frac{3,000,000 \cdot c_2}{2}n + (c_0 + c_1)$$

8.2 Cálculo del orden de complejidad stem 1f08ccc9cd7309ba1e756c3d9345ad9f

Para determinar el orden de complejidad, realizamos el análisis asintótico:

  1. Descartamos los términos de menor orden. La constante stem c852c1c3e0af6b7887c849f3302b5d4c es despreciable frente al término que contiene stem 55a049b8f161ae7cfeb0197d75aff967.

  2. Descartamos las constantes multiplicativas. Aunque el factor multiplicativo stem acb75d0ed3e46868dbdadfd102c6deef sea muy grande, sigue siendo una constante que no escala con el tamaño de la entrada stem 55a049b8f161ae7cfeb0197d75aff967.

El término dominante es stem 55a049b8f161ae7cfeb0197d75aff967, por lo que el algoritmo tiene una complejidad lineal.

$$T(n) \in \mathcal{O}(n)$$

Ejercicio 9

function ejercicio9(int n)
    int m = n / 10000                       // Línea 1
    for (int i = 0; i < n/2; i++)           // Línea 2
        for(int j = 0; j < m; j += 20)      // Línea 3
            print(i + j)                    // Línea 4
        end_for                             // Línea 5
    end_for                                 // Línea 6
    return n                                // Línea 7
end_function

9.1 Cálculo del stem cc4152a1ba8a0ec113e9f2062a489b7d

El tiempo de ejecución de la función viene dado por la suma del tiempo de ejecución de la inicialización, el bucle anidado y el retorno:

$$T(n) = T_{init}(n) + T_{bucle}(n) + T_{return}(n)$$

Donde stem a21d49011753b74adf8231a7bafbd35b y stem 7c6789c89c9c06ba4c6394d669cd2938.

Para calcular stem 27d001dc97ddb30aac93a9ed99cf9bda, analizamos las iteraciones de cada bucle:

  • Bucle externo (i): Va de stem 29632a9bf827ce0200454dd32fc3be82 a stem 1a58321b86708c45d4c924c4160952d7. El número de iteraciones es stem 9d2caaecfdd59c493baf322c918fb585.

  • Bucle interno (j): Va de stem 29632a9bf827ce0200454dd32fc3be82 a stem 60ace8ff4d114805b0b0334942a8e20f con incrementos de 20. Dado que stem 8dca79b7f8d3ef6b673c5d04e78c6b4a, el número de iteraciones es stem 9cd8b2b03f110e4ec9dd6a04eab941b9.

Podemos expresar el tiempo de ejecución del bucle total como un sumatorio anidado:

$$T_{bucle}(n) = \sum_{i=1}^{\lfloor n/2 \rfloor} \sum_{j=1}^{\lfloor \frac{n/10000 - 1}{20} + 1 \rfloor} c_2$$

Resolviendo el sumatorio interno:

$$\sum_{j=1}^{\lfloor \frac{n/10000 - 1}{20} + 1 \rfloor} c_2 = \left( \frac{n/10000 - 1}{20} + 1 \right) \cdot c_2$$

Sustituyendo en el sumatorio externo:

$$T_{bucle}(n) = \sum_{i=1}^{\lfloor n/2 \rfloor} \left( \frac{n}{200000} + 1 \right) \cdot c_2 = \lfloor n/2 \rfloor \cdot \left( \frac{n}{200000} + 1 \right) \cdot c_2 \approx \frac{n^2}{400000} c_2 + \frac{n}{2} c_2$$

Sustituyendo en la expresión original de stem cc4152a1ba8a0ec113e9f2062a489b7d:

$$T(n) \approx \frac{c_2}{400000}n^2 + \frac{c_2}{2}n + (c_0 + c_1)$$

9.2 Cálculo del orden de complejidad stem 3987120c67ed5a9162aa9841b531c3a9

Para determinar el orden de complejidad, realizamos el análisis asintótico:

  1. Descartamos los términos de menor orden. Los términos stem 55a049b8f161ae7cfeb0197d75aff967 y las constantes son despreciables frente al crecimiento de stem 021273d50c6ff03efebda428e9e42d77.

  2. Descartamos las constantes multiplicativas. El factor stem 3aa51a1b10515af863c66ac4bbdc1ece no afecta al crecimiento asintótico.

El término dominante es stem 021273d50c6ff03efebda428e9e42d77, por lo que el algoritmo tiene una complejidad cuadrática.

$$T(n) \in \mathcal{O}(n^2)$$

Ejercicio 10

function ejercicio10(int n)
    int m = n * n                           // Línea 1
    for (int i = n/2; i > 1; i = i / 3)     // Línea 2
        for(int j = 0; j < m; j++)          // Línea 3
            print(i + j)                    // Línea 4
        end_for                             // Línea 5
    end_for                                 // Línea 6
    return n                                // Línea 7
end_function

10.1 Cálculo del stem cc4152a1ba8a0ec113e9f2062a489b7d

El tiempo de ejecución de la función viene dado por la suma del tiempo de ejecución de la inicialización, el bucle anidado y el retorno:

$$T(n) = T_{init}(n) + T_{bucle}(n) + T_{return}(n)$$

Donde stem a21d49011753b74adf8231a7bafbd35b y stem 7c6789c89c9c06ba4c6394d669cd2938. La expresión se simplifica a:

$$T(n) = c_0 + T_{bucle}(n) + c_1$$

Para calcular stem 27d001dc97ddb30aac93a9ed99cf9bda, analizamos las iteraciones de cada bucle:

  • Bucle externo (i): Analizamos la progresión geométrica decreciente de los valores que toma la variable stem 77a3b857d53fb44e33b53e4c8b68351a, con valor inicial stem d6d54860f3796e33548482099695dec5 y dividiéndose por 3 en cada paso (stem 3f2254c18aa7b54a42bd67623e2ca2f9). El bucle continúa mientras stem cb0138b93ce6862f80e8510104aacf57. Despejando el número de iteraciones en la última vuelta (stem 63bb9849783d01d91403bc9a5fea12a2):

    $$\begin{aligned}
&\frac{n/2}{3^k} > 1 \\
&n/2 > 3^k \\
&\log_3(n/2) > k
\end{aligned}$$

    El número de iteraciones es stem af3f4e8044e3a1868d8202d24496690d.

Por las propiedades de los logaritmos stem 35364b3dbcf48c57219f0f13d582583a.

  • Bucle interno (j): Va de stem 29632a9bf827ce0200454dd32fc3be82 a stem 60ace8ff4d114805b0b0334942a8e20f con incrementos de 1. Como stem f0e310e1d65d07a3b87b28d152addcf6, el número de iteraciones es stem 021273d50c6ff03efebda428e9e42d77.

Podemos expresar el tiempo de ejecución del bucle total como un sumatorio anidado:

$$T_{bucle}(n) = \sum_{k=0}^{\lfloor \log_3(n/2) \rfloor} \sum_{j=0}^{n^2-1} c_2$$

Resolviendo el sumatorio interno:

$$\sum_{j=0}^{n^2-1} c_2 = n^2 \cdot c_2$$

Sustituyendo en el sumatorio externo:

$$T_{bucle}(n) = \sum_{k=0}^{\lfloor \log_3(n/2) \rfloor} (n^2 \cdot c_2) = (\lfloor \log_3(n/2) \rfloor + 1) \cdot n^2 \cdot c_2$$

Sustituyendo en la expresión original de stem cc4152a1ba8a0ec113e9f2062a489b7d:

$$T(n) = c_2 \cdot n^2 \cdot (\lfloor \log_3(n/2) \rfloor + 1) + c_0 + c_1$$

10.2 Cálculo del orden de complejidad stem aa9870286704e5b13ffbef6fbdd552a2

Para determinar el orden de complejidad, realizamos el análisis asintótico:

  1. Descartamos los términos de menor orden. Las constantes stem 09d819a43c6e2990856e40dbda09f893 y stem 988584bba6844388f07ea45b7132f61c son despreciables frente al término dominante que incluye stem 021273d50c6ff03efebda428e9e42d77 y el logaritmo. Además, la constante aditiva stem c11fe0cea175e1b787b3403c763dc9b0 del logaritmo es de menor orden.

  2. Descartamos las constantes multiplicativas. El factor stem e355414b8774603011922d600510b1df no afecta al crecimiento asintótico.

  3. Cambio de base y constantes en el logaritmo. Recordamos que stem 5e4f0152bece1cb46c6f9c4ad0a93efa. La resta de una constante no altera el orden asintótico, y la base del logaritmo se omite en la notación de orden de complejidad.

El término dominante es stem cae39afcd90738027e1da79e5377c106, por lo que el algoritmo tiene una complejidad cuadrática logarítmica.

$$T(n) \in \mathcal{O}(n^2 \log n)$$

Ejercicio 11

function ejercicio11(int n)
    int m = 2147483647; //MAX_INTEGER       // Línea 1
    for (int i = 0; i < m; i++)             // Línea 2
        for(int j = m; j < m; j = j / 2)    // Línea 3
            print(i + j)                    // Línea 4
        end_for                             // Línea 5
    end_for                                 // Línea 6
    return n                                // Línea 7
end_function

11.1 Cálculo del stem cc4152a1ba8a0ec113e9f2062a489b7d

El tiempo de ejecución de la función viene dado por la suma del tiempo de ejecución de la inicialización, el bucle anidado y el retorno:

$$T(n) = T_{init}(n) + T_{bucle}(n) + T_{return}(n)$$

Donde stem a21d49011753b74adf8231a7bafbd35b y stem 7c6789c89c9c06ba4c6394d669cd2938. La expresión se simplifica a:

$$T(n) = c_0 + T_{bucle}(n) + c_1$$

Para calcular stem 27d001dc97ddb30aac93a9ed99cf9bda, analizamos las iteraciones de cada bucle:

  • Bucle interno (j): Su inicialización es j = m y su condición de continuación es j < m. Como la variable j comienza con un valor igual a m, la condición j < m es falsa desde la primera evaluación. Por lo tanto, el cuerpo del bucle interno (línea 4) no se ejecuta nunca (0 iteraciones). Sin embargo, evaluar la condición del bucle interno en cada iteración del bucle externo tiene un coste constante stem e355414b8774603011922d600510b1df.

  • Bucle externo (i): Va de stem 29632a9bf827ce0200454dd32fc3be82 a stem 60ace8ff4d114805b0b0334942a8e20f con incrementos de 1. El número de iteraciones es exactamente stem 0e51a2dede42189d77627c4d742822c3. Como stem afb0e3895f81bbf44c69df7af837a264, este es un valor enorme, pero totalmente constante (no depende de la variable de entrada stem 55a049b8f161ae7cfeb0197d75aff967).

El bucle externo se ejecuta stem 0e51a2dede42189d77627c4d742822c3 veces, y en cada iteración solo se realiza la evaluación de la condición del bucle interno (stem e355414b8774603011922d600510b1df).

Podemos expresar el tiempo de ejecución del bucle total como un sumatorio:

$$T_{bucle}(n) = \sum_{i=0}^{m-1} c_2 = m \cdot c_2$$

Sustituyendo el valor constante de stem 0e51a2dede42189d77627c4d742822c3:

$$T_{bucle}(n) = 2147483647 \cdot c_2$$

Sustituyendo en la expresión original de stem cc4152a1ba8a0ec113e9f2062a489b7d:

$$T(n) = 2147483647 \cdot c_2 + c_0 + c_1$$

11.2 Cálculo del orden de complejidad stem 1e2f931ee6c0b8e7a51a7b0d123d514f

Para determinar el orden de complejidad, realizamos el análisis asintótico:

  1. El número de operaciones que realiza la función no depende del valor de stem 55a049b8f161ae7cfeb0197d75aff967.

  2. Todos los términos de la expresión stem 1855e80d2e8a571caf16b1f0b7ca5258 son valores constantes. En el análisis asintótico, toda expresión constante se agrupa y asimila a stem 763ae90b99d9a097268a69255a49cd99.

Dado que el algoritmo requiere el mismo tiempo de ejecución independientemente del tamaño de la entrada, tiene una complejidad constante.

$$T(n) \in \mathcal{O}(1)$$

3. Bucles anidados dependientes

Ejercicio 12

function ejercicio12(int n)
    for (int i = 1; i <= n; i++)            // Línea 1
        for(int j = 1; j <= i; j++)         // Línea 2
            print(i + j)                    // Línea 3
        end_for                             // Línea 4
    end_for                                 // Línea 5
    return n                                // Línea 6
end_function

12.1 Cálculo del stem cc4152a1ba8a0ec113e9f2062a489b7d

El tiempo de ejecución de la función viene dado por la suma del tiempo de ejecución del bucle anidado y el retorno:

$$T(n) = T_{bucle}(n) + T_{return}(n)$$

Como stem 7c6789c89c9c06ba4c6394d669cd2938, la expresión se simplifica a:

$$T(n) = T_{bucle}(n) + c_1$$

Para calcular stem 27d001dc97ddb30aac93a9ed99cf9bda, analizamos las iteraciones de cada bucle. A diferencia de los bucles anidados independientes, en este caso el límite superior del bucle interno depende de la variable del bucle externo.

  • Bucle externo (i): Va de stem 034d0a6be0424bffe9a6e7ac9236c0f5 a stem 55a049b8f161ae7cfeb0197d75aff967 con incrementos de 1.

  • Bucle interno (j): Va de stem 034d0a6be0424bffe9a6e7ac9236c0f5 a stem 77a3b857d53fb44e33b53e4c8b68351a con incrementos de 1. El número de iteraciones para un valor dado de stem 77a3b857d53fb44e33b53e4c8b68351a es exactamente stem 77a3b857d53fb44e33b53e4c8b68351a.

Podemos expresar el tiempo de ejecución del bucle total mediante un doble sumatorio:

$$T_{bucle}(n) = \sum_{i=1}^{n} \sum_{j=1}^{i} c_2$$

Donde stem e355414b8774603011922d600510b1df es el coste constante de las operaciones ejecutadas en el bucle interno (línea 3).

Resolvemos primero el sumatorio interno:

$$\sum_{j=1}^{i} c_2 = c_2 \cdot i$$

Ahora sustituimos este resultado en el sumatorio externo:

$$T_{bucle}(n) = \sum_{i=1}^{n} (c_2 \cdot i) = c_2 \sum_{i=1}^{n} i$$

Recordamos que la suma de los stem 55a049b8f161ae7cfeb0197d75aff967 primeros números naturales (progresión aritmética) es stem ef78227b617e7d8917aa744b431c698e.

Sustituyendo la fórmula anterior en la expresión del sumatorio:

$$T_{bucle}(n) = c_2 \cdot \frac{n(n+1)}{2} = \frac{c_2}{2} n^2 + \frac{c_2}{2} n$$

Sustituyendo en la expresión original de stem cc4152a1ba8a0ec113e9f2062a489b7d:

$$T(n) = \frac{c_2}{2} n^2 + \frac{c_2}{2} n + c_1$$

12.2 Cálculo del orden de complejidad stem 3987120c67ed5a9162aa9841b531c3a9

Para determinar el orden de complejidad, realizamos el análisis asintótico:

  1. Descartamos los términos de menor orden. Los términos proporcionales a stem 55a049b8f161ae7cfeb0197d75aff967 y las constantes (stem 988584bba6844388f07ea45b7132f61c) son despreciables frente al término cuadrático stem 021273d50c6ff03efebda428e9e42d77 cuando stem 55a049b8f161ae7cfeb0197d75aff967 es grande.

  2. Descartamos las constantes multiplicativas. El factor stem 334adefc49dc83c3ab5e1880ab122baa no afecta al crecimiento asintótico de la función.

El término dominante es stem 021273d50c6ff03efebda428e9e42d77, por lo que el algoritmo tiene una complejidad cuadrática.

$$T(n) \in \mathcal{O}(n^2)$$

Ejercicio 13

function ejercicio13(int n)
    for (int i = 1; i <= n * n - 10; i++)           // Línea 1
        for(int j = 1; j <= i; j++)                 // Línea 2
            print(i + j)                            // Línea 3
        end_for                                     // Línea 4
    end_for                                         // Línea 5
    return n                                        // Línea 6
end_function

13.1 Cálculo del stem cc4152a1ba8a0ec113e9f2062a489b7d

El tiempo de ejecución de la función viene dado por la suma del tiempo de ejecución del bucle anidado y el retorno:

$$T(n) = T_{bucle}(n) + T_{return}(n)$$

Como stem 7c6789c89c9c06ba4c6394d669cd2938, la expresión se simplifica a:

$$T(n) = T_{bucle}(n) + c_1$$

Para calcular stem 27d001dc97ddb30aac93a9ed99cf9bda, analizamos las iteraciones de cada bucle. A diferencia de los bucles anidados independientes, en este caso el límite superior del bucle interno depende de la variable del bucle externo.

  • Bucle externo (i): Va de stem 034d0a6be0424bffe9a6e7ac9236c0f5 a stem 5dc471e2a03e66d0851d8c226a213bd2 con incrementos de 1.

  • Bucle interno (j): Va de stem 034d0a6be0424bffe9a6e7ac9236c0f5 a stem 77a3b857d53fb44e33b53e4c8b68351a con incrementos de 1. El número de iteraciones para un valor dado de stem 77a3b857d53fb44e33b53e4c8b68351a es exactamente stem 77a3b857d53fb44e33b53e4c8b68351a.

Podemos expresar el tiempo de ejecución del bucle total mediante un doble sumatorio:

$$T_{bucle}(n) = \sum_{i=1}^{n^2-10} \sum_{j=1}^{i} c_2$$

Donde stem e355414b8774603011922d600510b1df es el coste constante de las operaciones ejecutadas en el bucle interno (línea 3).

Resolvemos primero el sumatorio interno:

$$\sum_{j=1}^{i} c_2 = c_2 \cdot i$$

Ahora sustituimos este resultado en el sumatorio externo:

$$T_{bucle}(n) = \sum_{i=1}^{n^2-10} (c_2 \cdot i) = c_2 \sum_{i=1}^{n^2-10} i$$

Recordamos que la suma de los stem 0e51a2dede42189d77627c4d742822c3 primeros números naturales (progresión aritmética) es stem 23e0c4b51188fff88b6f652d611e8352.

Aplicando la fórmula para el límite stem 7891e10f5da9724863a282ee27681fd0:

$$T_{bucle}(n) = c_2 \cdot \frac{(n^2-10)((n^2-10)+1)}{2} = c_2 \cdot \frac{(n^2-10)(n^2-9)}{2}$$

Desarrollando el producto polinómico:

$$T_{bucle}(n) = \frac{c_2}{2} (n^4 - 9n^2 - 10n^2 + 90) = \frac{c_2}{2} n^4 - \frac{19c_2}{2} n^2 + 45c_2$$

Sustituyendo en la expresión original de stem cc4152a1ba8a0ec113e9f2062a489b7d:

$$T(n) = \frac{c_2}{2} n^4 - \frac{19c_2}{2} n^2 + 45c_2 + c_1$$

13.2 Cálculo del orden de complejidad stem 4a083b18a8d541584fecf7c22fb90fa5

Para determinar el orden de complejidad, realizamos el análisis asintótico:

  1. Descartamos los términos de menor orden. Los términos proporcionales a stem 021273d50c6ff03efebda428e9e42d77 y las constantes (stem eace713d0a418eb46d16625ceb317ab3) son despreciables frente al término polinómico de mayor grado stem b8985a36f81997cf1b82e64e0d91e640 cuando stem 55a049b8f161ae7cfeb0197d75aff967 es grande.

  2. Descartamos las constantes multiplicativas. El factor stem 334adefc49dc83c3ab5e1880ab122baa no afecta al crecimiento asintótico de la función.

El término dominante es stem b8985a36f81997cf1b82e64e0d91e640, por lo que el algoritmo tiene una complejidad polinómica de grado 4.

$$T(n) \in \mathcal{O}(n^4)$$

Ejercicio 14

function ejercicio14(int n)
    for (int i = 1; i <= n; i++)                    // Línea 1
        for(int j = 1; j <= i; j++)                 // Línea 2
            for(int k = 1; k <= i; k++)             // Línea 3
                print(i + j + k)                    // Línea 4
            end_for                                 // Línea 5
        end_for                                     // Línea 6
    end_for                                         // Línea 7
    return n                                        // Línea 8
end_function

14.1 Cálculo del stem cc4152a1ba8a0ec113e9f2062a489b7d

El tiempo de ejecución de la función viene dado por la suma del tiempo de ejecución del bucle anidado y el retorno:

$$T(n) = T_{bucle}(n) + T_{return}(n)$$

Como stem 7c6789c89c9c06ba4c6394d669cd2938, la expresión se simplifica a:

$$T(n) = T_{bucle}(n) + c_1$$

Para calcular stem 27d001dc97ddb30aac93a9ed99cf9bda, analizamos las iteraciones de cada bucle. A diferencia de los bucles anidados independientes, en este caso los límites superiores de los bucles interno e intermedio dependen de la variable del bucle externo.

  • Bucle externo (i): Va de stem 034d0a6be0424bffe9a6e7ac9236c0f5 a stem 55a049b8f161ae7cfeb0197d75aff967 con incrementos de 1.

  • Bucle intermedio (j): Va de stem 034d0a6be0424bffe9a6e7ac9236c0f5 a stem 77a3b857d53fb44e33b53e4c8b68351a con incrementos de 1. Su número de iteraciones es stem 77a3b857d53fb44e33b53e4c8b68351a.

  • Bucle interno (k): Va de stem 034d0a6be0424bffe9a6e7ac9236c0f5 a stem 77a3b857d53fb44e33b53e4c8b68351a con incrementos de 1. Su número de iteraciones es stem 77a3b857d53fb44e33b53e4c8b68351a.

Dado que los bucles j y k son independientes entre sí pero ambos dependen de i, el número total de iteraciones de los dos bucles más internos para un valor dado de stem 77a3b857d53fb44e33b53e4c8b68351a es stem baa9f03bd6ba881dc64b9b4f2bf6221c.

Podemos expresar el tiempo de ejecución del bucle total mediante un triple sumatorio:

$$T_{bucle}(n) = \sum_{i=1}^{n} \sum_{j=1}^{i} \sum_{k=1}^{i} c_2$$

Donde stem e355414b8774603011922d600510b1df es el coste constante de las operaciones ejecutadas en el bucle interno (línea 4).

Resolvemos los sumatorios de adentro hacia afuera. Primero el sumatorio interno en stem 63bb9849783d01d91403bc9a5fea12a2:

$$\sum_{k=1}^{i} c_2 = c_2 \cdot i$$

Luego el sumatorio intermedio en stem 36b5afebdba34564d884d347484ac0c7:

$$\sum_{j=1}^{i} (c_2 \cdot i) = c_2 \cdot i \sum_{j=1}^{i} 1 = c_2 \cdot i \cdot i = c_2 \cdot i^2$$

Ahora sustituimos este resultado en el sumatorio externo en stem 77a3b857d53fb44e33b53e4c8b68351a:

$$T_{bucle}(n) = \sum_{i=1}^{n} (c_2 \cdot i^2) = c_2 \sum_{i=1}^{n} i^2$$

Recordamos que la suma de los cuadrados de los stem 55a049b8f161ae7cfeb0197d75aff967 primeros números naturales es stem a520b17d51c42dae9b8ca6ac670de656.

Aplicando esta fórmula:

$$T_{bucle}(n) = c_2 \cdot \frac{n(n+1)(2n+1)}{6} = c_2 \cdot \frac{2n^3 + 3n^2 + n}{6}$$

Desarrollando la fracción:

$$T_{bucle}(n) = \frac{c_2}{3} n^3 + \frac{c_2}{2} n^2 + \frac{c_2}{6} n$$

Sustituyendo en la expresión original de stem cc4152a1ba8a0ec113e9f2062a489b7d:

$$T(n) = \frac{c_2}{3} n^3 + \frac{c_2}{2} n^2 + \frac{c_2}{6} n + c_1$$

14.2 Cálculo del orden de complejidad stem 90846c243bb784093adbb6d2d0b2b9d0

Para determinar el orden de complejidad, realizamos el análisis asintótico:

  1. Descartamos los términos de menor orden. Los términos proporcionales a stem 021273d50c6ff03efebda428e9e42d77, stem 55a049b8f161ae7cfeb0197d75aff967 y las constantes (stem 988584bba6844388f07ea45b7132f61c) son despreciables frente al término polinómico de mayor grado stem 69b104384fb98e2ca8d49437b77c09a8 cuando stem 55a049b8f161ae7cfeb0197d75aff967 es grande.

  2. Descartamos las constantes multiplicativas. El factor stem ce5b12c4fb66bdff7da8ec35c1fae7ff no afecta al crecimiento asintótico de la función.

El término dominante es stem 69b104384fb98e2ca8d49437b77c09a8, por lo que el algoritmo tiene una complejidad cúbica (polinómica de grado 3).

$$T(n) \in \mathcal{O}(n^3)$$

Ejercicio 15

function ejercicio15(int n)
    for (int i = 1; i <= n; i++)                    // Línea 1
        for(int j = 1; j <= i; j++)                 // Línea 2
            for(int k = 1; k <= j; k++)             // Línea 3
                print(i + j + k)                    // Línea 4
            end_for                                 // Línea 5
        end_for                                     // Línea 6
    end_for                                         // Línea 7
    return n                                        // Línea 8
end_function

15.1 Cálculo del stem cc4152a1ba8a0ec113e9f2062a489b7d

El tiempo de ejecución de la función viene dado por la suma del tiempo de ejecución del bucle anidado y el retorno:

$$T(n) = T_{bucle}(n) + T_{return}(n)$$

Como stem 7c6789c89c9c06ba4c6394d669cd2938, la expresión se simplifica a:

$$T(n) = T_{bucle}(n) + c_1$$

Para calcular stem 27d001dc97ddb30aac93a9ed99cf9bda, analizamos las iteraciones de cada bucle. A diferencia de los bucles anidados independientes, en este caso los límites superiores de los bucles interno e intermedio dependen de la variable del bucle externo.

  • Bucle externo (i): Va de stem 034d0a6be0424bffe9a6e7ac9236c0f5 a stem 55a049b8f161ae7cfeb0197d75aff967 con incrementos de 1.

  • Bucle intermedio (j): Va de stem 034d0a6be0424bffe9a6e7ac9236c0f5 a stem 77a3b857d53fb44e33b53e4c8b68351a con incrementos de 1.

  • Bucle interno (k): Va de stem 034d0a6be0424bffe9a6e7ac9236c0f5 a stem 36b5afebdba34564d884d347484ac0c7 con incrementos de 1. Su número de iteraciones depende del valor de stem 36b5afebdba34564d884d347484ac0c7.

Dado que los bucles están anidados y cada uno depende del anterior, el número total de iteraciones se calcula mediante un triple sumatorio:

$$T_{bucle}(n) = \sum_{i=1}^{n} \sum_{j=1}^{i} \sum_{k=1}^{j} c_2$$

Donde stem e355414b8774603011922d600510b1df es el coste constante de las operaciones ejecutadas en el bucle interno (línea 4).

Resolvemos los sumatorios de adentro hacia afuera. Primero el sumatorio interno en stem 63bb9849783d01d91403bc9a5fea12a2:

$$\sum_{k=1}^{j} c_2 = c_2 \cdot j$$

Luego el sumatorio intermedio en stem 36b5afebdba34564d884d347484ac0c7:

$$\sum_{j=1}^{i} (c_2 \cdot j) = c_2 \sum_{j=1}^{i} j = c_2 \cdot \frac{i(i+1)}{2} = \frac{c_2}{2} (i^2 + i)$$

Ahora sustituimos este resultado en el sumatorio externo en stem 77a3b857d53fb44e33b53e4c8b68351a:

$$T_{bucle}(n) = \sum_{i=1}^{n} \frac{c_2}{2} (i^2 + i) = \frac{c_2}{2} \left( \sum_{i=1}^{n} i^2 + \sum_{i=1}^{n} i \right)$$

Recordamos las fórmulas de las sumas:

  • stem ef78227b617e7d8917aa744b431c698e

  • stem a520b17d51c42dae9b8ca6ac670de656

Aplicando las fórmulas:

$$T_{bucle}(n) = \frac{c_2}{2} \left( \frac{n(n+1)(2n+1)}{6} + \frac{n(n+1)}{2} \right)$$

Para simplificar esta expresión, realizamos los siguientes pasos algebraicos.

Factorizamos el término común stem 132122235da7e27dfed089f00ba361db:

$$T_{bucle}(n) = \frac{c_2 \cdot n(n+1)}{2} \left( \frac{2n+1}{6} + \frac{1}{2} \right)$$

Sumamos las fracciones dentro del paréntesis (denominador común 6):

$$\frac{2n+1}{6} + \frac{3}{6} = \frac{2n+4}{6} = \frac{2(n+2)}{6} = \frac{n+2}{3}$$

Multiplicamos los resultados para obtener la fórmula compacta:

$$T_{bucle}(n) = \frac{c_2 \cdot n(n+1)}{2} \cdot \frac{n+2}{3} = c_2 \cdot \frac{n(n+1)(n+2)}{6}$$

Desarrollamos el polinomio y distribuimos el denominador:

$$T_{bucle}(n) = c_2 \cdot \frac{n^3 + 3n^2 + 2n}{6} = \frac{c_2}{6} n^3 + \frac{c_2}{2} n^2 + \frac{c_2}{3} n$$

Sustituyendo en la expresión original de stem cc4152a1ba8a0ec113e9f2062a489b7d:

$$T(n) = \frac{c_2}{6} n^3 + \frac{c_2}{2} n^2 + \frac{c_2}{3} n + c_1$$

15.2 Cálculo del orden de complejidad stem 90846c243bb784093adbb6d2d0b2b9d0

Para determinar el orden de complejidad, realizamos el análisis asintótico:

  1. Descartamos los términos de menor orden. Los términos proporcionales a stem 021273d50c6ff03efebda428e9e42d77, stem 55a049b8f161ae7cfeb0197d75aff967 y las constantes (stem 988584bba6844388f07ea45b7132f61c) son despreciables frente al término polinómico de mayor grado stem 69b104384fb98e2ca8d49437b77c09a8 cuando stem 55a049b8f161ae7cfeb0197d75aff967 es grande.

  2. Descartamos las constantes multiplicativas. El factor stem 9563c8bed9fdd41095cc8438d3891744 no afecta al crecimiento asintótico de la función.

El término dominante es stem 69b104384fb98e2ca8d49437b77c09a8, por lo que el algoritmo tiene una complejidad cúbica (polinómica de grado 3).

$$T(n) \in \mathcal{O}(n^3)$$

4. Bucles con while

Ejercicio 16

function ejercicio16(int n)
    while (n > 1)                       // Línea 1
        print(n)                        // Línea 2
        n = n / 2                       // Línea 3
    end_while                           // Línea 4
    return 0                            // Línea 5
end_function

16.1 Cálculo del stem cc4152a1ba8a0ec113e9f2062a489b7d

El tiempo de ejecución de la función viene dado por la suma del tiempo de ejecución del bucle y el tiempo de ejecución de la operación de retorno:

$$T(n) = T_{bucle}(n) + T_{return}(n)$$

Como stem 7c6789c89c9c06ba4c6394d669cd2938, donde stem 988584bba6844388f07ea45b7132f61c es el tiempo constante de la operación de retorno:

$$T(n) = T_{bucle}(n) + c_1$$

Para determinar el número de iteraciones del bucle while (líneas 1-4), analizamos la progresión geométrica decreciente de los valores que toma la variable stem 55a049b8f161ae7cfeb0197d75aff967:

  • Iteración 0: stem 55a049b8f161ae7cfeb0197d75aff967

  • Iteración 1: stem d6d54860f3796e33548482099695dec5

  • Iteración 2: stem 0926aac9442c3079533a8a6a1e158b47

  • Iteración k: stem 81e71d0682c4df7481febaf7d952b3b1

El bucle continúa iterando mientras se cumpla la condición stem 47ed6aeb1344c9e53b60e9f4650e6474. Para despejar el número de iteraciones en la última vuelta (stem 63bb9849783d01d91403bc9a5fea12a2), establecemos la inecuación para el límite de iteraciones:

$$\begin{aligned}
&\frac{n}{2^k} > 1 \\
&n > 2^k \\
&\log_2(n) > \log_2(2^k) \\
&\log_2 n > k
\end{aligned}$$

Por las propiedades de los logaritmos stem 35364b3dbcf48c57219f0f13d582583a.

El número total de iteraciones está acotado por stem b05aab0d8c8ece743c788f7ff538b926.

Podemos expresar el tiempo de ejecución del bucle como un sumatorio donde el índice stem 63bb9849783d01d91403bc9a5fea12a2 representa cada iteración:

$$T_{bucle}(n) = \sum_{k=1}^{\lfloor \log_2 n \rfloor} c_2$$

Donde stem e355414b8774603011922d600510b1df es el tiempo constante de las operaciones dentro del bucle (líneas 2 y 3). Resolviendo el sumatorio obtenemos:

$$T_{bucle}(n) = c_2 \cdot \lfloor \log_2 n \rfloor$$

Sustituyendo en la expresión original:

$$T(n) = T_{bucle}(n) + c_1 = c_2 \cdot \lfloor \log_2 n \rfloor + c_1$$

16.2 Cálculo del orden de complejidad stem 0d4b7f5b66e994af32a32cfa26868d53

Para determinar el orden de complejidad, realizamos el análisis asintótico:

  1. Descartamos los términos de menor orden. La constante stem 988584bba6844388f07ea45b7132f61c es un término de orden inferior comparado con stem 68f1bbb87512454065f67d6f1803da9e.

  2. Descartamos las constantes multiplicativas. La constante stem e355414b8774603011922d600510b1df no afecta al crecimiento asintótico.

  3. Cambio de base del logaritmo. Todas las funciones logarítmicas pertenecen al mismo orden de complejidad, independientemente de la base.

El término dominante es stem 6931c25b0d6a07c96e4160eac934c79d, por lo que el algoritmo tiene una complejidad logarítmica.

$$T(n) \in \mathcal{O}(\log n)$$

5. Algoritmos recursivos

Ejercicio 17

long int factorial(long int n) {
    if (n <= 1)                         // Línea 1
        return 1;                       // Línea 2
    else                                // Línea 3
        return n * factorial(n - 1);    // Línea 4
}

17.1 Cálculo de la ecuación de recurrencia

El tiempo de ejecución de un algoritmo recursivo se expresa mediante una ecuación de recurrencia, donde se separa el tiempo de ejecución del caso base del tiempo del caso recursivo.

Para la función factorial(n), consideramos:

  • stem 988584bba6844388f07ea45b7132f61c: Tiempo de ejecución del caso base (stem 1a73633946f8d5b35991ca6940e5aeaf).

  • stem e355414b8774603011922d600510b1df: Tiempo constante de las operaciones realizadas en cada llamada recursiva (comparaciones, resta, multiplicación y retorno).

La ecuación de recurrencia queda expresada como:

$$T(n) = \begin{cases}
c_1 & \text{si } n \leq 1 \\
T(n-1) + c_2 & \text{si } n > 1
\end{cases}$$

17.2 Resolución de la ecuación stem cc4152a1ba8a0ec113e9f2062a489b7d

Para encontrar una expresión no recursiva de stem cc4152a1ba8a0ec113e9f2062a489b7d, utilizamos el método de sustitución:

  1. Partimos de la expresión original para el caso recursivo:

    $$T(n) = T(n-1) + c_2 \quad \text{(1)}$$
  2. Obtenemos la expresión de stem 2ede1be9beaddd330820eef93fb6a4d7 sustituyendo stem 55a049b8f161ae7cfeb0197d75aff967 por stem efcf8d472ecdd2ea56d727b5746100e3 en la ecuación original:

    $$T(n-1) = T(n-1-1) + c_2 = T(n-2) + c_2 \quad \text{(2)}$$
  3. Sustituimos la ecuación (2) en la (1):

    $$T(n) = (T(n-2) + c_2) + c_2 = T(n-2) + 2c_2 \quad \text{(3)}$$
  4. Repetimos el proceso para stem 11df6e2fc7ca42de624c4077fcd6d852:

    $$T(n-2) = T(n-3) + c_2 \quad \text{(4)}$$
    $$T(n) = (T(n-3) + c_2) + 2c_2 = T(n-3) + 3c_2 \quad \text{(5)}$$
  5. Podemos inferir que tras stem 77a3b857d53fb44e33b53e4c8b68351a sustituciones, el tiempo de ejecución está dado por:

    $$T(n) = T(n-i) + i \cdot c_2 \quad \text{(6)}$$
  6. El proceso de sustitución termina cuando alcanzamos el caso base (stem a28fcb5349ba4c3ee41f9de23337f3e8). Despejando stem 77a3b857d53fb44e33b53e4c8b68351a:

    $$i = n - 1$$
  7. Sustituimos el valor de stem 77a3b857d53fb44e33b53e4c8b68351a en la ecuación (6):

    $$T(n) = T(1) + (n-1)c_2 \quad \text{(7)}$$
  8. Como sabemos que stem a78d2f574bc8634ad2cdc4e593648fb9 (caso base), la expresión final es:

    $$T(n) = c_1 + (n-1)c_2 = c_2 n + (c_1 - c_2) \quad \text{(8)}$$

17.3 Cálculo del orden de complejidad stem 1f08ccc9cd7309ba1e756c3d9345ad9f

Para determinar el orden de complejidad, realizamos el análisis asintótico sobre la expresión obtenida:

  1. Descartamos los términos de menor orden. En la expresión stem 566009b72d23e9ff35be0d4f9ec98041, el término dominante es el que depende de stem 55a049b8f161ae7cfeb0197d75aff967. La constante stem 6f3b4feb236d0863e9aa074f56c0f972 es despreciable cuando stem 55a049b8f161ae7cfeb0197d75aff967 es grande.

  2. Descartamos las constantes multiplicativas. El factor stem e355414b8774603011922d600510b1df no afecta a la tasa de crecimiento de la función.

El término dominante es stem 55a049b8f161ae7cfeb0197d75aff967, por lo que el algoritmo tiene una complejidad lineal.

$$T(n) \in \mathcal{O}(n)$$

Ejercicio 18

int recursiva1(int n) {
    if (n <= 1)                         // Línea 1
        return 1;                       // Línea 2
    else                                // Línea 3
        return 2 * recursiva1(n / 2);   // Línea 4
}

18.1 Cálculo de la ecuación de recurrencia

Para la función recursiva1(n), definimos:

  • stem 988584bba6844388f07ea45b7132f61c: Tiempo de ejecución del caso base (stem 1a73633946f8d5b35991ca6940e5aeaf).

  • stem e355414b8774603011922d600510b1df: Tiempo constante de las operaciones realizadas en cada llamada recursiva (comparación, división por 2, multiplicación por 2 y retorno).

La ecuación de recurrencia queda expresada como:

$$T(n) = \begin{cases}
c_1 & \text{si } n \leq 1 \\
T(n/2) + c_2 & \text{si } n > 1
\end{cases}$$

18.2 Resolución de la ecuación stem cc4152a1ba8a0ec113e9f2062a489b7d

Para encontrar una expresión no recursiva de stem cc4152a1ba8a0ec113e9f2062a489b7d, utilizamos el método de sustitución:

  1. Partimos de la expresión original para el caso recursivo:

    $$T(n) = T(n/2) + c_2 \quad \text{(1)}$$
  2. Obtenemos la expresión de stem 743d9fda839158aefb7f0bbb55b88502 sustituyendo stem 55a049b8f161ae7cfeb0197d75aff967 por stem d6d54860f3796e33548482099695dec5 en la ecuación original:

    $$T(n/2) = T((n/2)/2) + c_2 = T(n/2^2) + c_2 \quad \text{(2)}$$
  3. Sustituimos la ecuación (2) en la (1):

    $$T(n) = (T(n/2^2) + c_2) + c_2 = T(n/2^2) + 2c_2 \quad \text{(3)}$$
  4. Repetimos el proceso para el siguiente paso:

    $$T(n/2^2) = T(n/2^3) + c_2 \quad \text{(4)}$$
    $$T(n) = (T(n/2^3) + c_2) + 2c_2 = T(n/2^3) + 3c_2 \quad \text{(5)}$$
  5. Podemos inferir que tras stem 77a3b857d53fb44e33b53e4c8b68351a sustituciones, el tiempo de ejecución está dado por:

    $$T(n) = T(n/2^i) + i \cdot c_2 \quad \text{(6)}$$
  6. El proceso de sustitución termina cuando alcanzamos el caso base (stem 830b9ffc96aefc2ff53910d47d9551a4). Despejamos stem 77a3b857d53fb44e33b53e4c8b68351a:

    $$2^i = n \implies i = \log_2 n$$
  7. Sustituimos el valor de stem 77a3b857d53fb44e33b53e4c8b68351a en la ecuación (6):

    $$T(n) = T(1) + (\log_2 n) \cdot c_2 \quad \text{(7)}$$
  8. Como sabemos que stem a78d2f574bc8634ad2cdc4e593648fb9 (caso base), la expresión final es:

    $$T(n) = c_1 + c_2 \log_2 n \quad \text{(8)}$$

18.3 Cálculo del orden de complejidad stem 0d4b7f5b66e994af32a32cfa26868d53

Para determinar el orden de complejidad, realizamos el análisis asintótico sobre la expresión obtenida:

  1. Descartamos los términos de menor orden. La constante stem 988584bba6844388f07ea45b7132f61c es un término de orden inferior comparado con stem 68f1bbb87512454065f67d6f1803da9e.

  2. Descartamos las constantes multiplicativas. El factor stem e355414b8774603011922d600510b1df no afecta a la tasa de crecimiento asintótico.

  3. Cambio de base del logaritmo. Todas las funciones logarítmicas pertenecen al mismo orden de complejidad, independientemente de la base del logaritmo.

El término dominante es stem 6931c25b0d6a07c96e4160eac934c79d, por lo que el algoritmo tiene una complejidad logarítmica.

$$T(n) \in \mathcal{O}(\log n)$$

Ejercicio 19

int recursiva2(int n, int x) {
    int i;
    if (n <= 1)                         // Línea 1
        return 1;                       // Línea 2
    else {                              // Línea 3
        for (i = 1; i <= n; i++)        // Línea 4
            x = x + 1;                  // Línea 5
        return recursiva2(n - 1, x);    // Línea 6
    }
}

19.1 Cálculo de la ecuación de recurrencia

Para la función recursiva2(n, x), definimos:

  • stem 988584bba6844388f07ea45b7132f61c: Tiempo de ejecución del caso base (stem 1a73633946f8d5b35991ca6940e5aeaf).

  • stem e355414b8774603011922d600510b1df: Tiempo constante asociado a cada iteración del bucle for (líneas 4 y 5).

  • Consideramos que el resto de operaciones constantes se asimilan en el coste del bucle o en las constantes finales.

La ecuación de recurrencia es:

$$T(n) = \begin{cases}
c_1 & \text{si } n \leq 1 \\
T(n-1) + c_2 n & \text{si } n > 1
\end{cases}$$

19.2 Resolución de la ecuación stem cc4152a1ba8a0ec113e9f2062a489b7d

Para encontrar una expresión no recursiva de stem cc4152a1ba8a0ec113e9f2062a489b7d, utilizamos el método de sustitución:

  1. Partimos de la expresión original para el caso recursivo:

    $$T(n) = T(n-1) + c_2 n \quad \text{(1)}$$
  2. Obtenemos la expresión de stem 2ede1be9beaddd330820eef93fb6a4d7 sustituyendo en la ecuación original:

    $$T(n-1) = T(n-2) + c_2(n-1) \quad \text{(2)}$$
  3. Sustituimos la ecuación (2) en la (1):

    $$T(n) = (T(n-2) + c_2(n-1)) + c_2 n = T(n-2) + c_2(n + n-1) \quad \text{(3)}$$
  4. Repetimos el proceso para stem 11df6e2fc7ca42de624c4077fcd6d852:

    $$T(n-2) = T(n-3) + c_2(n-2) \quad \text{(4)}$$
    $$T(n) = (T(n-3) + c_2(n-2)) + c_2(n + n-1) = T(n-3) + c_2(n + n-1 + n-2) \quad \text{(5)}$$
  5. Podemos inferir que tras stem 77a3b857d53fb44e33b53e4c8b68351a sustituciones, el tiempo de ejecución está dado por:

    $$T(n) = T(n-i) + c_2 \sum_{k=0}^{i-1} (n-k) \quad \text{(6)}$$
  6. El proceso termina cuando alcanzamos el caso base (stem a28fcb5349ba4c3ee41f9de23337f3e8), lo que implica stem 622e733ea9716c1b65f5fbd43e22b7d5. Sustituimos en la ecuación (6):

    $$T(n) = T(1) + c_2 \sum_{k=0}^{n-2} (n-k) \quad \text{(7)}$$
  7. Evaluamos el sumatorio. Representa la suma de los enteros desde stem 55a049b8f161ae7cfeb0197d75aff967 hasta stem 76c5792347bb90ef71cfbace628572cf:

    $$\sum_{k=0}^{n-2} (n-k) = n + (n-1) + (n-2) + \dots + 2 = \left( \sum_{j=1}^{n} j \right) - 1$$
  8. Aplicando la fórmula de la suma de los stem 55a049b8f161ae7cfeb0197d75aff967 primeros enteros (stem dfd3161e4056e122d3e61f641a30de06):

    $$T(n) = c_1 + c_2 \left( \frac{n(n+1)}{2} - 1 \right) = \frac{c_2}{2} n^2 + \frac{c_2}{2} n + (c_1 - c_2) \quad \text{(8)}$$

19.3 Cálculo del orden de complejidad stem 3987120c67ed5a9162aa9841b531c3a9

Para determinar el orden de complejidad, realizamos el análisis asintótico sobre la expresión obtenida:

  1. Descartamos los términos de menor orden. Los términos proporcionales a stem 55a049b8f161ae7cfeb0197d75aff967 y las constantes son despreciables frente a stem 021273d50c6ff03efebda428e9e42d77 cuando stem 55a049b8f161ae7cfeb0197d75aff967 es grande.

  2. Descartamos las constantes multiplicativas. El factor stem 334adefc49dc83c3ab5e1880ab122baa no afecta al crecimiento asintótico.

El término dominante es stem 021273d50c6ff03efebda428e9e42d77, por lo que el algoritmo tiene una complejidad cuadrática.

$$T(n) \in \mathcal{O}(n^2)$$

Ejercicio 20

int recursiva3(int n) {
    if (n <= 1)                                       // Línea 1
        return 1;                                     // Línea 2
    else                                              // Línea 3
        return recursiva3(n - 1) + recursiva3(n - 1); // Línea 4
}

20.1 Cálculo de la ecuación de recurrencia

Para la función recursiva3(n), definimos:

  • stem 988584bba6844388f07ea45b7132f61c: Tiempo de ejecución del caso base (stem 1a73633946f8d5b35991ca6940e5aeaf).

  • stem e355414b8774603011922d600510b1df: Tiempo constante asociado a las operaciones en el caso recursivo (comparación, resta, suma de los resultados y retorno).

La ecuación de recurrencia es:

$$T(n) = \begin{cases}
c_1 & \text{si } n \leq 1 \\
2T(n-1) + c_2 & \text{si } n > 1
\end{cases}$$

20.2 Resolución de la ecuación stem cc4152a1ba8a0ec113e9f2062a489b7d

Para encontrar una expresión no recursiva de stem cc4152a1ba8a0ec113e9f2062a489b7d, utilizamos el método de sustitución:

  1. Partimos de la expresión original para el caso recursivo:

    $$T(n) = 2T(n-1) + c_2 \quad \text{(1)}$$
  2. Obtenemos la expresión de stem 2ede1be9beaddd330820eef93fb6a4d7 sustituyendo en la ecuación original:

    $$T(n-1) = 2T(n-2) + c_2 \quad \text{(2)}$$
  3. Sustituimos la ecuación (2) en la (1):

    $$T(n) = 2(2T(n-2) + c_2) + c_2 = 2^2 T(n-2) + 2c_2 + c_2 = 4T(n-2) + 3c_2 \quad \text{(3)}$$
  4. Repetimos el proceso para stem 11df6e2fc7ca42de624c4077fcd6d852:

    $$T(n-2) = 2T(n-3) + c_2 \quad \text{(4)}$$
    $$T(n) = 4(2T(n-3) + c_2) + 3c_2 = 2^3 T(n-3) + 4c_2 + 3c_2 = 8T(n-3) + 7c_2 \quad \text{(5)}$$
  5. Podemos inferir que tras stem 77a3b857d53fb44e33b53e4c8b68351a sustituciones, el tiempo de ejecución está dado por:

    $$T(n) = 2^i T(n-i) + (2^i - 1)c_2 \quad \text{(6)}$$
  6. El proceso termina cuando alcanzamos el caso base (stem a28fcb5349ba4c3ee41f9de23337f3e8), lo que implica stem 622e733ea9716c1b65f5fbd43e22b7d5. Sustituimos en la ecuación (6):

    $$T(n) = 2^{n-1} T(1) + (2^{n-1} - 1)c_2 \quad \text{(7)}$$
  7. Como sabemos que stem a78d2f574bc8634ad2cdc4e593648fb9, simplificamos la expresión:

    $$T(n) = 2^{n-1} c_1 + 2^{n-1} c_2 - c_2 = 2^{n-1}(c_1 + c_2) - c_2$$
    $$T(n) = \frac{c_1 + c_2}{2} \cdot 2^n - c_2 \quad \text{(8)}$$

20.3 Cálculo del orden de complejidad stem 443303b171835ec871c1e857d8665088

Para determinar el orden de complejidad, realizamos el análisis asintótico sobre la expresión obtenida:

  1. Descartamos los términos de menor orden. La constante stem e355414b8774603011922d600510b1df es despreciable frente al crecimiento exponencial de stem f8f25e4580c418a51dc556db0d8d2b93 cuando stem 55a049b8f161ae7cfeb0197d75aff967 es grande.

  2. Descartamos las constantes multiplicativas. El factor stem 9b2ad1108fe3173bd0da5a1fdfe59075 no afecta a la tasa de crecimiento asintótico.

El término dominante es stem f8f25e4580c418a51dc556db0d8d2b93, por lo que el algoritmo tiene una complejidad exponencial.

$$T(n) \in \mathcal{O}(2^n)$$

6. Referencias

7. Licencia

Licencia CC BY-NC-ND 4.0

Este material ha sido creado por José Juan Sánchez Hernández © 2026, y su contenido se distribuye bajo una licencia Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International.

Esta licencia exige que quienes reutilicen el material otorguen el debido crédito al autor. Permite copiar y redistribuir el material en cualquier medio o formato, únicamente en su forma original, y solo para fines no comerciales.