Sie können dies extrem schnell mit dem Union-Find-Algorithmus tun.
Die Idee ist, einen Wald von Bäumen zu haben, wobei jeder Baum Elemente "darstellt, die gleich sind". Sie stellen diesen Baum als einfaches Array dar, wobei a[i] entweder der Elternteil von i sein kann, -1 wenn i die Wurzel ist, oder -2, wenn i noch nicht in einem Baum ist.
In Ihrem Fall würden Sie mit dem einfachen Baum beginnen:
1
\
5
Als nächstes möchten Sie 6 und 8 verbinden. Da sie beide nicht zugeordnet sind, fügen Sie einen neuen Baum hinzu. (Das heißt a[6]=-1, a[8]=6):
1 6
\ \
5 8
Nun möchten Sie 6 und 1 verbinden. Sie finden heraus, zu welchen Sets sie gehören, indem Sie ihren Eltern bis nach oben folgen. Zufälligerweise sind sie beide Wurzeln. In diesem Fall machen wir den kleineren Baum zum Kind des anderen Baums. (a[6]=1)
1
/ \
6 5
\
8
Zuletzt möchten wir 9 und 3 verbinden, da sie beide nicht zugeordnet sind, erstellen wir einen neuen Baum. (a[3]=-1, a[9]=3)
1 9
/ \ \
6 5 3
\
8
Angenommen, Sie haben auch 5=3? Folgen Sie ihren Eltern, bis Sie die Wurzeln erreichen. Sie stellen fest, dass sie nicht schon gleich sind, also vereinen Sie die Bäume. Da die 9 einen weniger hohen Baum steuert, fügen wir sie dem Baum von 1 hinzu, um zu erhalten:
.1.
/ | \
6 9 5
\ \
8 3
Wie Sie sehen können, ist es jetzt einfach zu überprüfen, ob zwei Elemente im selben Set sind. Möchten Sie beispielsweise testen, ob 8 und 3 gleich sind? Folgen Sie einfach ihren Pfaden nach oben, und Sie werden sehen, dass 8 im Set von eins und drei im Set von 9 liegt. Daher sind sie ungleich.
Mit der Heuristik, den kleineren Baum immer under den größeren zu setzen, erhalten Sie eine durchschnittliche Find- oder Merge-Zeit von log(n). Der Wikipedia-Artikel erklärt einen zusätzlichen Trick, der es im Grunde genommen zu konstanter Zeit macht.