Bonjour đ
Cette semaine on se retrouvait pour le problĂšme #133 Clone Graph. LâĂ©noncĂ© est clair: rĂ©aliser la copie profonde dâun graphe.
Le graphe est reprĂ©sentĂ© via une liste d'adjacence. Chaque nĆud possĂšde deux attributs; un entier reprĂ©sentant sa valeur et la liste de ses voisins.
class Node {
public int val;
public List<Node> neighbors;
}
LâĂ©noncĂ© prĂ©cise que lâon aura pas plus de 100 nĆuds Ă traiter et les graphes proposĂ©s sont connexe (fully connected).
Intuition
Pour faire la copie profonde, on a besoin de parcourir lâensemble des nĆuds du graphe.
Pour ça, on peut sây prendre de deux façons: Parcours en largeur (BFS) ou en profondeur (DFS).
On a Ă©galement besoin dâune structure de donnĂ©es pour suivre les nĆuds visitĂ©s. La difficultĂ© dans ce problĂšme est de sâassurer que lâon visite chaque nĆud une seule fois. Une table de hachage est adaptĂ©e pour tenir Ă jour une Ă©quivalence ancien nĆud -> nouveau nĆud.
Implémentation
LâimplĂ©mentation de Vincent avec la DFS tient en une dizaine de lignes en Python 1
class Solution:
def cloneGraph(self, node: 'Node') -> 'Node':
visited = dict()
def dfs(n:'Node') -> 'Node':
if n in visited: return visited[n]
new_node = Node(n.val)
visited[n] = new_node
for nei in n.neighbors:
new_node.neighbors.append(dfs(nei))
return new_node
return dfs(node)
Pour lâimplĂ©mentation via une BFS, on a besoin dâune file (queue) supplĂ©mentaire pour suivre les noeuds Ă visiter. Ce nâest pas nĂ©cessaire avec la DFS qui utilise une pile implicite correspondant Ă la pile des appels (call stack) de la fonction DFS.
Analyse de la complexité
En temps dâexĂ©cution, parcourir le graphe coĂ»te O(V + E), avec V le nombre de nĆuds (Vertex) et E le nombre dâarcs (Edge) dans le graphe. Pour chaque itĂ©ration de la DFS, on a une opĂ©ration de lecture et possiblement dâinsertion dans un dictionaire qui coĂ»te O(1) chacune.
La complexitĂ© sur le runtime est donc de O(1) * O(V + E) = O(V + E).En mĂ©moire, on a besoin dâun dictionnaire pour maintenir un mapping pour chaque noeud du graphe dâorigine vers son homologue dans le graphe clonĂ©, soit un coĂ»t de O(V).
Le condensĂ©e de la session avec walkthrough du code est disponible sur Youtube đ
Prochaine session
Ce samedi 8 mai, on marque une pause dans notre cycle graphe pour sâattaquer Ă un challenge: le Weekly Contest 239 đ
Le format dâun contest?
đQuatre exercices avec une difficultĂ© crescendo.
Un facile, deux mediums et un difficile.âDes sujets variĂ©s.
Câest une bonne occasion de faire autre chose que du parcours de graphe et de prendre le pouls sur dâautre types dâexos.â± PrĂ©voir 1h30 dans son agenda.
On se dit Ă samedi prochain, 09:30am sur notre Twitch LeetGrindFr đ
Mots-clés de la session
graphe, copie profonde, bfs, dfs
Photo de thumbnail de Francesco Ungaro de Pexels