El curso de coursera “Algorithms, Part I” me vino excelente ya que este año quería mejorar mis
conocimientos en algoritmos. El
curso es totalmente gratuito y los vídeos son de altísimo nivel, muy recomendado.
La primera semana introduce un par de algoritmos de conectividad dinámica, son Quick Find y Quick Union. Estos
algoritmos permiten conectar y verificar la conexión que existe entre nodos de una
estructura de tipo Árbol, representada en un Array. Primero escribiré sobre
Quick Find y en otro post sobre Quick Union, para no hacer los posts tan largos.
Quick Find
El algoritmo se basa en 2 funciones principales, Union
y Find, Union permite conectar 2 nodos y Find permite verificar si dos nodos están
conectados, directa o indirectamente, es decir a través de otros nodos.
Union
La unión permite conectar 2 nodos, la lógica es simple (complejidad O(n)), se basa en recorrer todo el arreglo dentro de un ciclo y establecer como raíz al nodo2 en todos los nodos que tengan como raíz al nodo1, para ello basta con verificar en
cada paso si arreglo[i] == arreglo[nodo1], de ser verdadero, sustituir arreglo[i]
con el valor del arreglo[nodo2]. De manera tal que todos tengan el mismo nodo raíz, en Pseudopython sería:
def union(int []array, int node1, int node2): temp = array[node1] for i to len(array): if array[i] == temp: array[i] = array[node2]
Find
Con find se verifica si dos nodos están conectados y es una
operación muy rápida, O(1), creo que por eso el nombre del algoritmo
“Quick Find”, basta con verificar si los nodos tienen comparten la misma raíz arreglo[nodo1]==arreglo[nodo2]
Imagen tomada de uno de los vídeos del curso en Coursera
Por ejemplo, en la imagen los nodos 0 5 y 6 están conectados. En el arreglo el valor en la posición id[0] id[5] e id[6] es 0 ya que el id 0 es algo así como el nodo raíz y la forma de verificar si están conectados es que todos tengan el mismo valor.
Dejo mi intento de implementar Quick Find en C#, muy parecido a la versión Java del curso, pero que imprime el arreglo y el índice para visualizar mejor el resultado del algoritmo.
Salida
True
i: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
id[i]: 0, 1, 2, 8, 8, 5, 5, 7, 8, 8
Referencias:
Algorithms, Part I
https://www.cs.princeton.edu/~rs/AlgsDS07/01UnionFind.pdf
No hay comentarios:
Publicar un comentario