Cette version dense de l'algorithme de Kruskal est-elle bien connue?

15

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 O(mJournalm)(sans supposer des arêtes pré-triées). Plus précisément, nous atteignons Θ(n2) 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 composant i, le bord de croisement de composant le plus léger soit i.

  • Lorsque vous trouvez le bord le plus léger qui traverse les partitions, trouvez simplement iqui minimise le poids de dist[i], en temps linéaire.

  • cjecjUNEUNEje,k=min{UNEje,k,UNEj,k}kjej

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.n-1Θ(n2)

Cette version de Kruskal est-elle bien connue dans la littérature?

Federico Lebrón
la source

Réponses:

19

O(n2)O(n2) sont données dans mon article "Regroupement hiérarchique rapide et autres applications des paires les plus proches dynamiques "(SODA 1998, arXiv: cs.DS / 9912014 et J. Experimental Algorithms 2000):

  1. Utilisez plutôt Prim – Dijkstra – Jarník, puis triez les bords pour obtenir la séquence d'insertion que Kruskal donnerait, ou

  2. Utilisez la structure de données de la paire la plus proche à quatre arbres décrite dans l'article, en considérant Kruskal comme une procédure d'agrégation agglomérative standard où nous fusionnons les deux clusters les plus proches en un superamas à chaque étape, le "plus proche" étant défini comme la longueur du bord le plus court reliant deux clusters .

La solution 2 est similaire dans son esprit à ce que vous décrivez, mais les détails sur la façon de suivre les distances entre les clusters sont légèrement différents. Vous conservez les minima par ligne de la matrice de distance de cluster, ce qui vous permet de parcourir cette liste de minima de ligne en temps linéaire pour trouver le minimum global, tandis que mon article superpose un quadtree sur la même matrice et garde une trace du minimum dans chaque carré quadtree. Votre méthode est plus simple, mais moins flexible pour certains autres problèmes de paire la plus proche dynamique (cela dépend du fait que la fusion de deux clusters entraîne une diminution de leurs distances par rapport aux autres clusters, vrai pour ce problème mais pas nécessairement pour d'autres).

Comme je l'ai écrit en 2011 dans l'article de Wikipedia sur l' algorithme de chaîne du plus proche voisin , cet algorithme peut également être utilisé pour effectuer Kruskal en temps . Cependant (contrairement à certaines autres applications de l'algorithme de chaîne du plus proche voisin), vous n'obtenez pas d'économie d'espace, donc (comme la méthode quadtree et votre méthode), l'espace est toujours O ( n 2 ) . En revanche, le tri Prim + ne peut utiliser que l' espace O ( n ) au-delà de celui nécessaire pour stocker l'entrée.O(n2)O(n2)O(n)

David Eppstein
la source