Linearer Zeitmarkierungsalgorithmus für einen Baum?

12

Ich habe einen ungerichteten Baum, dessen Eckpunkte ich beschriften möchte. Die Blattknoten sollten mit einem gekennzeichnet sein. Dann nehmen wir an, die Blätter wurden entfernt. In dem verbleibenden Baum sollten die Blätter mit zwei gekennzeichnet sein. Dieser Vorgang wird auf offensichtliche Weise fortgesetzt, bis alle Scheitelpunkte eine Beschriftung haben. Der Grund, warum ich das tue, ist, dass ich die Eckpunkte in einer Warteschlange speichern und sie "zuerst verlassen" möchte. Gibt es eine einfache Möglichkeit, diese O(n+m) -Zeit durchzuführen?

Ich kann das Problem lösen, indem ich bei jedem Schritt ein BFS durchführe. Aber im schlimmsten Fall entferne ich bei jedem Schritt durch jeden Scheitelpunkt genau zwei Blätter und reihe sie ein. Ich glaube, das braucht quadratische Zeit.

Eine andere Idee war, zuerst alle Blätter zu finden und dann von jedem Blatt ein BFS durchzuführen. Das gibt mir nicht die gewünschte Lösung. Betrachten Sie beispielsweise eine Art "Kronendiagramm" wie in der folgenden Abbildung. Die gewünschte Lösung wird angezeigt. Wenn Sie jedoch ein BFS von jedem Blatt starten, werden nur zwei Etiketten verwendet.

Bildbeschreibung hier eingeben

Idealerweise wäre der lineare Zeitalgorithmus auch leicht zu erklären und zu implementieren.

Bob Whiz
quelle

Antworten:

8

Unbewurzelte Bäume

Sie können eine Prioritätswarteschlange verwenden, um dies in zu lösen :O(E+VlogV)

  • Stellen Sie alle Eckpunkte in eine Prioritätswarteschlange, wobei ihre Priorität der Grad ist.
  • Während die Warteschlange nicht leer ist:
    • Entfernen Sie einen Scheitelpunkt mit minimaler Priorität, der 1 (oder ganz am Ende 0 ) sein muss.v10
    • Sei , wobei u über alle ursprünglichen Nachbarn von v geht .σ(v)=1+maxσ(u)uv
    • Subtrahieren Sie von der Priorität des eindeutigen verbleibenden Nachbarn von u (falls vorhanden).1u

Tatsächlich brauchen wir keine Prioritätswarteschlange, und dieser Algorithmus kann unter Verwendung einer einfachen Warteschlange in der Zeit implementiert werden :Ö(E+V)

  • Initialisieren Sie ein Array der Länge mit den Graden aller Scheitelpunkte.V
  • Initialisiere ein anderes Array der Länge mit "lebendig".V
  • Gehen Sie einmal durch das erste Array und verschieben Sie alle Scheitelpunkte des Grades in eine Warteschlange.1
  • Während die Warteschlange nicht leer ist:
    • Pop ein Scheitelpunkt .v
    • Sei , wobei u über alle ursprünglichen Nachbarn von v geht .σ(v)=1+maxσ(u)uv
    • Markiere als "tot".v
    • Wenn einen "lebendigen" Nachbarn u hat , subtrahiere 1 von dem Grad von u .vu1u
    • Wenn der neue Grad der ist 1 , Push u in die Warteschlange.u1u

Verwurzelte Bäume

Verwenden Sie stattdessen DFS. Hier ist eine Skizze des Algorithmus.

  • Bei einem gegebenen Knoten , wenn v ein Blatt ist , Set D ( v ) = 1 .vvd(v)=1
  • Wenn kein Blatt ist, führen Sie den Algorithmus für alle seine Kinder aus und lassen Sie dann d ( v ) = 1 + max d ( u ) , wobei u die Menge aller Kinder überschreitet.vd(v)=1+maxd(u)u

Sie führen diesen Algorithmus im Stammverzeichnis aus.

Yuval Filmus
quelle
Ist das richtig? Betrachten Sie den Baum 1-> 2-> 3-> 4-> 5, wobei 1 die Wurzel ist. 2 sollte das Label 1 bekommen, aber Sie geben 3? Oder mit Kindern meinst du Nachbarn? Von welchem ​​Knoten starten wir dann das dfs?
Knoothe
Meine Implementierung ist "off by one", aber Ihrer Beschreibung zufolge sollte das Label 4 erhalten , da Sie zuerst 5 , dann 4 und dann 3 entfernen müssen und erst dann 2 zu einem Blatt wird. 245432
Yuval Filmus
Ich habe die Frage nicht gestellt :-). Ich interpretierte die Frage als: Ein ungerichteter Baum. Beschriften Sie alle Blätter. Lösche sie. Rekursieren Sie auf dem resultierenden Baum. In diesem Fall ist der Baum tatsächlich 1-2-3-4-5, Schritt 1, Sie löschen 1 und 5, dann 2 und 4 und dann 3. Siehe Abschnitt über "Kronendiagramm". Dies ist einer der klassischen Algorithmen zum Ermitteln des Mittelpunkts eines Baums.
Knoothe
1 ist kein Blatt. Es ist weit davon entfernt, ein Blatt zu sein, es ist die Wurzel. Ich habe die Frage so interpretiert, dass sie auf bewurzelte Bäume abzielt. Vielleicht sollten wir warten, bis das OP antwortet.
Yuval Filmus
2
@YuvalFilmus, nur um meine 2 Cent reinzuwerfen, sollte es nicht ? Die Blätter sind 1 , wenn Sie sie löschen, sollten die neuen Blätter 2 sein. Dies ist also eine Art Maß dafür, wie viele Ebenen Sie löschen müssen, bevor der Scheitelpunkt zu einem Blatt wird. Mit min erhält jeder Scheitelpunkt, der an ein Blatt angrenzt, 2, aber es wird möglicherweise kein Blatt, wenn die Blätter gelöscht werden. Dieser Satz enthielt zu viele Blätter. Ich brauche einen Besen. 1+max{d(u)}12
Luke Mathieson
2

Eine einfache Antwort lautet wie folgt:

  • (u,v)uv

  • Topologisch sortieren Sie das Diagramm.

  • vv

O(n+m)O(n+m)

DW
quelle