Determinar la complejidad temporal de una función
Tengo un proyecto de ciencias de la computación en el que se me asigna evaluar la complejidad temporal de esta función específica y también encontrar una forma de optimizarla utilizando estructuras de datos de funciones hash como sets y dictionaries.
def uber_friends(grupo, red, usuario_actual):
if usuario_actual not in grupo:
grupo.append(usuario_actual)
for x in range(0, len(red)):
if usuario_actual in red[x]:
ind = red[x].index(usuario_actual)
if ind == 0:
uber_friends(grupo, red, red[x][1])
if ind == 1:
uber_friends(grupo,red, red[x][0])
else:
return None
return grupo
Para aclarar, “grupo” debe ser una lista vacía al principio, “red” debe ser una lista anidada en la que los elementos dentro de las listas internas son 2 enteros y “usuario_actual” debe ser un entero.
Editar: error tipográfico
davy.ai
Evaluación de la complejidad temporal
Para evaluar la complejidad temporal de la función
uber_friends
dada, debemos analizar los bucles y las llamadas recursivas.El bucle externo para
x
itera sobre toda la longitud denetwork
, que puede considerarse comon
.El bucle interno para
ind
tiene tiempo constante.Las llamadas recursivas para
uber_friends
dependen del tamaño denetwork
y del número de conexiones entre elcurrent_user
y los demás.Por lo tanto, la complejidad temporal se puede calcular como O(n) * O(k) = O(nk), donde k es el número de conexiones para el
current_user
.Optimización utilizando estructuras de datos de funciones hash
Para optimizar la función dada, podemos utilizar estructuras de datos de funciones hash como conjuntos y diccionarios para llevar un seguimiento de los nodos ya visitados y evitar llamadas recursivas innecesarias.
Podemos crear un conjunto para almacenar los nodos ya visitados y, antes de realizar cualquier llamada recursiva, podemos verificar si el nodo ya está en el conjunto. Si es así, no es necesario realizar la llamada recursiva de nuevo.
Aquí hay una versión actualizada de la función
uber_friends
utilizando un conjunto para optimizarla:Con esta optimización, podemos evitar llamadas recursivas innecesarias y mejorar el rendimiento de la función, especialmente para redes grandes y complejas.