Algorithme Union / find sans union par rang pour les forêts disjointes structure des données

Voici une ventilation de l'algorithme union/find Pour disjoint set forests sur wikipédia:

  • les forêts disjointes de Barebone... (O(n))
    • ... avec union par rang ... (maintenant améliorée O(log(n))
      • ... avec la compression de chemin (maintenant améliorée à O(a(n)) effectivement O(1))

la mise en oeuvre de l'union par rang nécessite que chaque noeud maintienne un rank champ pour des fins de comparaison. Ma question Est, est-ce que union by rank vaut cet espace supplémentaire? Que se passe-t-il si je laisse tomber le syndicat par rang et que je fais juste la compression de chemin à la place? Est-il assez bon? Quelle est la complexité amortie maintenant?


un commentaire est fait qui implique que l'union par rang sans compression de chemin (amorti O(log(n) complexité) est suffisant pour la plupart des applications pratiques. Cela est correct. Ce que je demande est l'inverse: et si vous sautez le syndicat par rang et Seulement la compression de chemin à la place?

dans un sens, la compression de chemin est une étape supplémentaire pour améliorer l'union par rang, et c'est pourquoi cette étape supplémentaire peut être omise sans conséquence désastreuse. Mais l'union par rang est-elle une étape intermédiaire nécessaire à la compression du chemin? Est-ce que je peux passer directement à la compression de chemin, ou est-ce que ce sera catastrophique?


il a également été souligné que sans syndicat par rang, les syndicats répétés pourraient créer une liste de type structure. Cela signifie qu'une opération de compression sur un seul chemin pourrait prendre O(n) dans le pire des cas. Cela affecterait évidemment les opérations futures, alors comment cela se déroule lorsque amorti sur de nombreuses opérations est ce qui m'intéresse le plus.

16
demandé sur polygenelubricants 2010-02-24 05:53:25

2 réponses

j'ai cherché sur Google pour "sans syndicat par rang" et le deuxième lien qui est venu était celui-ci:

...Nous fermons cette section avec un analyse de l'union-trouver avec le chemin compression mais sans union par rang...

L'union-find discbased avec chemin d'accès compression mais sans union par rang processus M find Et lien n-1 opérations dans le temps O ((M+n) log n)

7
répondu jkff 2010-02-24 14:29:30

la compression du chemin aplatit la structure de l'arbre. Union by rank aide à fusionner. Supposons que vous sautiez la dernière. Donc maintenant, vous avez une forêt sans informations de rang pour choisir comment fusionner. Potentiellement, vous courez maintenant le risque de fusionner un arbre avec une profondeur plus grande à un arbre avec une profondeur plus petite -- conduisant à une structure d'arbre déséquilibrée. Dans le pire des cas, vous pourriez vous retrouver avec une liste liée. La complexité amortie du temps de votre syndicat augmente même si celle de Find reste la même.

IMO, il serait préférable de sauter la compression du chemin d'accès mais pas le rang.

1
répondu dirkgently 2010-02-24 03:12:05