TL;DR: L'algorithme Floyd â Warshall calcule les chemins les plus courts de toutes les paires avec une programmation dynamique. Initialisez une matrice de distance Ă partir du graphique, puis pour chaque sommet intermĂ©diaire k, mettez Ă jour chaque paire avec dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]). Il s'exĂ©cute dans le temps O(VÂł) et dans l'espace O(VÂČ) et peut exposer des cycles nĂ©gatifs via des entrĂ©es diagonales nĂ©gatives.
Algorithme Floyd-Warshall : guide d'entretien de codage
Pratiquez la rĂ©currence, l'invariant de boucle, la trace matricielle, la reconstruction de chemin, les cas extrĂȘmes et l'explication de la complexitĂ©.
Essayer YesToTheOffer
Qu'est-ce que l'algorithme Floyd-Warshall ?
Floyd â Warshall est un algorithme de programmation dynamique pour les chemins les plus courts entre chaque paire ordonnĂ©e de sommets. Il fonctionne avec des graphiques pondĂ©rĂ©s orientĂ©s ou non et autorise des bords nĂ©gatifs. Cependant, si un cycle de poids nĂ©gatif pertinent existe, certains chemins les plus courts n'ont pas de minimum fini car le fait de parcourir le cycle Ă plusieurs reprises continue de rĂ©duire le coĂ»t du chemin.
L'algorithme est mémorable car il transforme un problÚme de chemin global en une seule décision : pour le sommet intermédiaire actuel k, le chemin le plus connu de i à j est-il meilleur tel quel, ou en passant de i à k puis de k à j ?
Comment calculez-vous la récidive ?
DĂ©finir D(k, i, j) comme la distance la plus courte de i Ă j dont les sommets intermĂ©diaires ne peuvent provenir que des k premiers sommets. Un chemin autorisĂ© le plus court soit Ă©vite le sommet k, en gardant D(kâ1, i, j), soit utilise k et se divise en le meilleur chemin autorisĂ© de i Ă k plus le meilleur chemin autorisĂ© de k Ă j.
Cela donne la récurrence :
D(k, i, j) = min(D(kâ1, i, j), D(kâ1, i, k) + D(kâ1, k, j))
Ătant donnĂ© que l'Ă©tape k dĂ©pend uniquement des valeurs de l'Ă©tape kâ1 de maniĂšre compatible, la matrice peut ĂȘtre mise Ă jour sur place. Ce raisonnement explique Ă©galement l'ordre critique des boucles : k doit ĂȘtre la boucle la plus externe. Mettre i ou j Ă l'extĂ©rieur modifie l'invariant et peut utiliser de maniĂšre incorrecte des chemins partiellement autorisĂ©s.
Comment initialiser la matrice de distance ?
Créez une matrice V par V. Définissez dist[i][i] sur zéro, définissez la cellule d'un bord direct sur son poids et utilisez l'infini lorsqu'aucun bord direct n'existe. Si des bords parallÚles sont possibles, conservez le plus petit poids direct. Avant d'ajouter deux distances, vérifiez que les deux sont finies afin qu'une sentinelle infinie ne déborde pas ou ne crée pas de faux candidat.
| Cellule matricielle | Valeur initiale | Raison |
|---|---|---|
| dist[i][i] | 0 | Chemin vide d'un sommet Ă lui-mĂȘme |
| Bord direct i â j | Poids du bord | Meilleur chemin sans sommet intermĂ©diaire |
| Pas de bord direct | Infini | La paire n'est pas encore connue pour ĂȘtre joignable |
| Bords parallÚles | Poids minimum des bords | La meilleure option directe est le scénario de base |
Comment retrouvez-vous Floyd-Warshall dans une interview ?
Ătiquetez les lignes de la matrice comme sources et les colonnes comme destinations. Montrez la matrice initiale, puis choisissez-en une k et Ă©valuez les cellules reprĂ©sentatives. Pour chaque cellule, comparez la valeur actuelle avec le parcours passant par k. Mettez Ă jour uniquement lorsque les deux segments sont accessibles et que la nouvelle somme est plus petite.
Vous nâavez normalement pas besoin de dessiner chaque matrice pour un grand exemple. Tracez suffisamment de cellules pour dĂ©montrer l'invariant, y compris une amĂ©lioration et une valeur inchangĂ©e. DĂ©clarez qu'aprĂšs avoir terminĂ© k, chaque entrĂ©e de la matrice est optimale parmi les chemins dont les sommets intermĂ©diaires sont limitĂ©s Ă l'ensemble traitĂ©.

Quel pseudocode devez-vous écrire ?
Utilisez trois boucles imbriquées avec k à l'extérieur :
for k from 0 to V - 1:
for i from 0 to V - 1:
for j from 0 to V - 1:
if dist[i][k] is finite and dist[k][j] is finite:
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])
Expliquez les contrĂŽles finis et le type numĂ©rique. Dans les langages avec une sentinelle entiĂšre de grande taille, l'ajout de l'infini Ă une valeur nĂ©gative peut sembler fini ou dĂ©border. Une garde fait partie de l'exactitude, pas seulement un dĂ©tail de mise en Ćuvre.
Quelles sont les complexités temporelles et spatiales ?
Les trois boucles examinent chaque combinaison de k, i et j, le temps d'exĂ©cution est donc O(VÂł). La matrice de distance occupe l'espace O(VÂČ). La mise Ă jour sur place Ă©vite une table tridimensionnelle, tandis qu'une matrice de saut suivant ou de prĂ©dĂ©cesseur pour la reconstruction du chemin ajoute O(VÂČ) plus d'espace.
Floyd â Warshall est souvent attrayant pour les graphes denses modestes car sa mise en Ćuvre est compacte et prĂ©visible. Pour un grand graphique clairsemĂ© avec des bords non nĂ©gatifs, exĂ©cuter Dijkstra Ă partir de chaque source peut ĂȘtre plus efficace. Comparez toujours la sortie requise, la densitĂ© du graphique, les contraintes de poids et le nombre de sommets avant de choisir.
Comment reconstruire le véritable chemin le plus court ?
Les distances Ă elles seules ne rĂ©vĂšlent pas la sĂ©quence des sommets. Conservez une matrice next[i][j] initialisĂ©e Ă j lorsqu'il existe une arĂȘte directe de i Ă j. Chaque fois que le routage via k amĂ©liore dist[i][j], dĂ©finissez next[i][j] sur next[i][k]. Pour reconstruire un chemin, dĂ©placez-vous Ă plusieurs reprises du sommet actuel vers next[current][destination] jusqu'Ă atteindre la destination.
Recherchez les paires inaccessibles avant la reconstruction et protĂ©gez-vous contre les cas de cycle nĂ©gatif. Si une paire peut voyager vers un cycle nĂ©gatif puis atteindre la destination, il nây a pas de chemin le plus court fini Ă reconstruire.
Comment Floyd-Warshall détecte-t-il les cycles négatifs ?
Une fois lâalgorithme terminĂ©, inspectez la diagonale. Une valeur dist[v][v] < 0 prouve qu'un cycle de poids nĂ©gatif est accessible Ă partir de v et peut revenir Ă v. C'est plus fort que la simple recherche d'un bord nĂ©gatif ; des arĂȘtes nĂ©gatives peuvent exister dans des graphiques avec des chemins les plus courts parfaitement valides.
Si l'enquĂȘteur demande quelles paires sont affectĂ©es, identifiez chaque i et j pour lesquels je peux atteindre un tel sommet v et v peut atteindre j. Ces paires peuvent parcourir le cycle nĂ©gatif de maniĂšre arbitraire plusieurs fois, de sorte que leur valeur de chemin le plus court n'est pas finie.
Quand devriez-vous choisir un autre algorithme du chemin le plus court ?
Utilisez la recherche en largeur pour les graphiques non pondĂ©rĂ©s, Dijkstra pour les problĂšmes Ă source unique avec des poids non nĂ©gatifs et Bellman-Ford pour une source unique lorsque les poids nĂ©gatifs ou la dĂ©tection de cycle nĂ©gatif accessible sont importants. Floyd â Warshall est le choix direct lorsque les distances toutes paires sont requises et que le temps cube est acceptable.
| Exigence | Choix typique |
|---|---|
| Source unique non pondérée | Recherche en largeur |
| Source unique pondérée positivement | Dijkstra |
| Pondérations négatives, source unique | Bellman-Ford |
| Toutes paires, graphe modeste ou dense | Floyd-Warshall |
Quelles erreurs dâentretien Ă©viter ?
Ne mettez pas k dans une autre boucle, n'oubliez pas les zĂ©ros sur la diagonale, n'ajoutez pas l'infini sans garde, ne confondez pas les arĂȘtes nĂ©gatives avec les cycles nĂ©gatifs ou ne prĂ©tendez pas que l'espace matriciel O(VÂČ) inclut automatiquement l'entrĂ©e dans chaque reprĂ©sentation. PrĂ©cisez si le graphique est orientĂ©, s'il existe des bords parallĂšles et si l'intervieweur a besoin de distances, de chemins ou de paires affectĂ©es par le cycle.
Pratiquez le workflow de l'assistant d'entretien de codage, comparez l'algorithme Bellman-Ford et consultez l'aide-mémoire sur la complexité Big O.
Questions fréquemment posées
FAQ
Ă quoi sert lâalgorithme Floyd-Warshall ?
Floyd-Warshall calcule les distances du chemin le plus court entre chaque paire de sommets dans un graphe pondéré. Il prend en charge les poids de bord négatifs, mais les chemins les plus courts ne sont pas bien définis pour les paires affectées par un cycle de poids négatif accessible.
Quelle est la récidive Floyd-Warshall ?
Pour chaque sommet intermĂ©diaire k, mettez Ă jour dist[i][j] au minimum de sa valeur actuelle et dist[i][k] plus dist[k][j]. La boucle la plus externe doit ĂȘtre k afin que chaque mise Ă jour utilise uniquement les sommets intermĂ©diaires autorisĂ©s.
Quelles sont les complexités temporelles et spatiales ?
L'algorithme standard s'exĂ©cute dans le temps O(VÂł) et utilise l'espace O(VÂČ) pour la matrice de distance. La reconstruction du chemin ajoute une autre matrice O(VÂČ) mais ne modifie pas la limite temporelle asymptotique.
Floyd-Warshall peut-il détecter les cycles négatifs ?
Oui. AprÚs avoir traité tous les sommets intermédiaires, une valeur négative sur dist[v][v] signifie qu'un cycle de poids négatif est accessible à partir de v. Un raisonnement supplémentaire sur l'accessibilité est nécessaire pour identifier chaque paire source-destination affectée par un tel cycle.
Quand dois-je utiliser Floyd-Warshall au lieu de Dijkstra ?
Utilisez Floyd â Warshall lorsque vous avez besoin de distances toutes paires, que le graphique est de taille modeste et qu'une solution simple de graphique dense est acceptable. Le Dijkstra rĂ©pĂ©tĂ© est gĂ©nĂ©ralement prĂ©fĂ©rable pour les grands graphiques clairsemĂ©s avec des poids non nĂ©gatifs.
Pratiquez l'invariant, pas seulement les boucles
YesToTheOffer peut vous aider Ă structurer une explication de codage, Ă l'ancrer dans vos notes de prĂ©paration privĂ©es, Ă examiner les cas extrĂȘmes et Ă conserver la transcription de l'entretien pour une rĂ©vision ultĂ©rieure.
Pratiquez l'invariant, pas seulement les boucles
RĂ©pĂ©tez la rĂ©currence, expliquez pourquoi k est le plus externe et testez la reconstruction du chemin et les cas extrĂȘmes de cycle nĂ©gatif.
Essayer YesToTheOffer