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
.
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.
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$.
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$.
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$).
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.
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()