Ejemplos 1

Búsqueda lineal

ALGORÍTMICA Y COMPLEJIDAD
Grados en Ing. Informática y Matemáticas
Universidad de Cantabria
Camilo Palazuelos Calderón

Definimos la función Buscar, que busca en el array $A[0..\ell - 1]$ la posición del elemento $x$, recibidos $A[0..\ell - 1]$ y $x$ como parámetros: si la encuentra, devuelve un entero no negativo $k$ tal que $A[k] = x$; si no, -1.

In [ ]:
def Buscar(A, x):
    for k in range(len(A)):
        if A[k] == x:
            return k
    return -1

Probamos la función con el array $A[0..5] = (10, -19, 18, 3, -20, 22)$ y los elementos $x = 18$ e $y = 19$. Buscar($A[0..5]$,$x$) y Buscar($A[0..5]$,$y$) deberían devolver 2 y -1, respectivamente.

In [ ]:
A = [10, -19, 18, 3, -20, 22]
x = 18
y = 19
print(f'Buscar({A}, {x}) =  {Buscar(A, x)}')
print(f'Buscar({A}, {y}) = { Buscar(A, y)}')
Buscar([10, -19, 18, 3, -20, 22], 18) =  2
Buscar([10, -19, 18, 3, -20, 22], 19) = -1

Para evaluar el coste temporal empírico de Buscar en el peor caso, creamos un array $B[0..m - 1] = (0, \ldots, 0)$ con $m$ suficientemente grande (por ejemplo, $m = 10^7$). Iterativamente, buscaremos el elemento $x = 1$ en las primeras $n$ posiciones de $B[0..m - 1]$ y añadiremos el coste temporal empírico de Buscar($B[0..n - 1]$,$x$) a una lista $T$.

In [ ]:
m = 10000000
B = [0 for _ in range(m)]
T = [0]

Modificamos Buscar para acceder a fragmentos de posiciones consecutivas de $B[0..m - 1]$ y evitar así crear arrays de entrada en cada iteración. Para ello, añadimos un parámetro $n$ a la cabecera de la función tal que $n \le m$.

In [ ]:
def Buscar2(A, x, n):
    for k in range(n):
        if A[k] == x:
            return k
    return -1

Evaluamos el coste temporal empírico de Buscar2 con arrays de longitud $n$ desde $1 \cdot 10^5$ hasta $100 \cdot 10^5$ (de $10^5$ en $10^5$).

In [ ]:
import time

for n in range(m // 100, m + 1, m // 100):
    t = time.time()
    Buscar2(B, 1, n)
    T.append(time.time() - t)
    #print(f'Iteración {n // (m // 100)} de 100')

Dibujamos una gráfica con el tiempo de ejecución $T(n)$ de Buscar2 en función de la longitud $n$ del array de entrada.

In [ ]:
import matplotlib.pyplot as plt
import numpy as np

with plt.style.context('ggplot'):
    plt.plot(np.array(T), label = '$T(n) \in O(n)$')
    plt.xticks(
        [    x               for x in range(0, 101, 20)],
        [f'${x} \cdot 10^5$' for x in range(0, 101, 20)])
    plt.xlabel(        '$n$', fontsize = 12)
    plt.ylabel('$T(n)$ en s', fontsize = 12)
    plt.title('Complejidad temporal')
    plt.legend()

plt.show()
No description has been provided for this image
In [ ]: