Il y a environ un an, un ami et moi avons pensé à un moyen d'implémenter l'algorithme de Kruskal pour des graphiques denses mieux que la limite habituelle (sans supposer des arêtes pré-triées). Plus précisément, nous atteignons dans tous les cas, semblable à celui de Prim lorsqu'il est implémenté à l'aide de matrices d'adjacence.
J'ai posté un peu sur l'algorithme dans mon blog , y compris le code C ++ et les benchmarks, mais voici l'idée générale:
Gérez un nœud représentatif pour chaque composant connecté. Initialement, tous les nœuds se représentent.
Maintenez un vecteur
dist[i]
tel que, pour chaque composanti
, le bord de croisement de composant le plus léger soiti
.Lorsque vous trouvez le bord le plus léger qui traverse les partitions, trouvez simplement
i
qui minimise le poids dedist[i]
, en temps linéaire.
La contraction du bord le plus léger et la découverte dudit bord peuvent donc toutes deux se faire en temps linéaire. Nous faisons cela fois pour trouver le MST. Un peu de comptabilité est nécessaire pour trouver réellement quel bord nous voulons ajouter au MST, mais cela n'augmente pas la complexité. Ainsi, le runtime est . L'implémentation n'est que quelques boucles for.
Cette version de Kruskal est-elle bien connue dans la littérature?