Documentos de Académico
Documentos de Profesional
Documentos de Cultura
- Encontrar la arista más pequeña que conecta un vértice incluido con uno no incluido.
La razón fundamental detrás de la complejidad O(E log V) es que para cada una de las E
aristas, puede haber un máximo de log(V) inserciones y extracciones en el min-heap. En el
peor caso, cada una de las E aristas se agrega y extrae del heap una vez, lo que resulta en
O(E log V).
from collections import defaultdict
import heapq
class Graph:
self.V = vertices
self.graph = defaultdict(list)
self.graph[src].append((dest, weight))
def prim_mst(self):
visited = set()
mst_weight = 0
while min_heap:
visited.add(vertex)
mst_weight += weight
return mst_weight
# Creación del grafo con 5 vértices y sus aristas
g = Graph(5)
g.add_edge(0, 1, 2)
g.add_edge(0, 3, 3)
g.add_edge(1, 2, 4)
g.add_edge(1, 3, 5)
g.add_edge(1, 4, 1)
g.add_edge(2, 4, 6)
g.add_edge(3, 4, 7)
mst_weight = g.prim_mst()
Algoritmo Kruskal
En resumen, Kruskal busca las aristas de menor peso y las agrega al árbol
de expansión mínimo siempre y cuando no generen ciclos. Al final, se
obtiene un árbol que conecta todos los vértices con el menor peso
posible.
Ordenamiento de las aristas: O(E log E) o O(E log V) - El costo de ordenar las aristas por
peso. Si las aristas están ordenadas por sus pesos, esto puede ser O(E log E), pero si E es
considerablemente mayor que V, se puede aproximar a O(E log V) debido a la relación
entre E y V.
class Graph:
self.V = vertices
self.graph = []
if parent[i] == i:
return i
x_root = self.find_parent(parent, x)
y_root = self.find_parent(parent, y)
if rank[x_root] < rank[y_root]:
parent[x_root] = y_root
parent[y_root] = x_root
else:
parent[y_root] = x_root
rank[x_root] += 1
def kruskal_mst(self):
result = []
parent = []
rank = []
parent.append(node)
rank.append(0)
i=0
e=0
i += 1
x = self.find_parent(parent, src)
y = self.find_parent(parent, dest)
if x != y:
e += 1
self.union(parent, rank, x, y)
return total_weight
g = Graph(6)
g.add_edge(0, 1, 4)
g.add_edge(0, 2, 3)
g.add_edge(1, 2, 1)
g.add_edge(1, 3, 2)
g.add_edge(1, 4, 3)
g.add_edge(2, 3, 4)
g.add_edge(3, 4, 5)
g.add_edge(4, 5, 6)
mst_weight = g.kruskal_mst()
import sys
def matrix_chain_order(p):
s = [[0 for _ in range(n)] for _ in range(n)] # Almacenar la ubicación del split óptimo
j=i+l-1
m[i][j] = cost
s[i][j] = k
return m, s
if i == j:
print(f"A{i}", end="")
else:
print("(", end="")
print_optimal_parens(s, i, s[i][j])
print_optimal_parens(s, s[i][j] + 1, j)
print(")", end="")
m, s = matrix_chain_order(matrix_dimensions)
print_optimal_parens(s, 0, len(matrix_dimensions) - 2)
A=LU
A−1=Uinv⋅Linv
sistema UX=b
Algoritmo de solución sistema lineal LX=b
import numpy as np
# Función para resolver Lx = b usando sustitución hacia adelante
n = len(b)
x = np.zeros(n)
x[i] = b[i]
x[i] /= L[i][i]
return x
L = np.array([[2, 0, 0],
[5, 3, 0],
[1, 8, 4]])
b = np.array([4, 6, 2])
solution = forward_substitution(L, b)
import numpy as np
# Función para la multiplicación de matrices
if cols_A != rows_B:
for i in range(rows_A):
for j in range(cols_B):
for k in range(cols_A):
return result
[3, 4]])
[7, 8]])
# Multiplicación de matrices
result_matrix = matrix_multiplication(matrix_A, matrix_B)
print(result_matrix)