Algoritmo di etichettatura del tempo lineare per un albero?


12

Ho un albero non diretto di cui voglio etichettare i vertici. I nodi foglia dovrebbero essere etichettati uno. Quindi, supponi che le foglie siano state rimosse. Nell'albero che rimane, le foglie dovrebbero essere etichettate due. Questo processo continua in modo ovvio fino a quando tutti i vertici hanno un'etichetta. Il motivo per cui lo faccio è che voglio archiviare i vertici in una coda e passarli attraverso "le foglie prima". C'è un modo semplice per fare questo O(n+m) tempo?

Posso risolvere il problema facendo un BFS ad ogni passo. Ma nel peggiore dei casi, ad ogni passo che passo attraverso ogni vertice, rimuovo esattamente due foglie e le accodano. Credo che ciò richieda un tempo quadratico.

Un'altra idea era quella di trovare prima tutte le foglie e quindi fare un BFS da ogni foglia. Questo non mi dà la soluzione desiderata. Ad esempio, considera una sorta di "grafico a corona" come nella figura seguente. Viene mostrata la soluzione desiderata, ma il lancio di un BFS da ogni foglia comporterebbe solo due etichette utilizzate.

inserisci qui la descrizione dell'immagine

Idealmente, l'algoritmo del tempo lineare sarebbe anche facile da spiegare e implementare.

Risposte:


8

Alberi non sradicati

O(E+VlogV)

  • Metti tutti i vertici in una coda prioritaria, con la priorità che è il loro grado.
  • Mentre la coda non è vuota:
    • v10
    • σ(v)=1+maxσ(u)uv
    • Sottrai dalla priorità del vicino unico rimanente di (se presente).1u

In effetti, non abbiamo davvero bisogno di una coda prioritaria e questo algoritmo può essere implementato usando una semplice coda nel tempo :O(E+V)

  • Inizializza una matrice di lunghezza con i gradi di tutti i vertici.V
  • Inizializza un altro array di lunghezza con "vivo".V
  • Passare una volta attraverso il primo array e spingere tutti i vertici di grado in una coda.1
  • Mentre la coda non è vuota:
    • Pop a vertice .v
    • Let , dove va oltre tutti i vicini originali del .σ(v)=1+maxσ(u)uv
    • Segna come "morto".v
    • Se ha qualche vicino di casa "vivo" , sottrarre dal grado di .vu1u
    • Se il nuovo grado di è , spingere alla coda.u1u

Alberi radicati

Utilizzare invece DFS. Ecco uno schizzo dell'algoritmo.

  • Dato un nodo , se è una foglia, impostare .vvd(v)=1
  • Se non è una foglia, eseguire l'algoritmo su tutti i suoi figli, e poi lasciare che , dove va oltre l'insieme di tutti i bambini.vd(v)=1+maxd(u)u

Esegui questo algoritmo sul root.


È giusto? Considera l'albero 1-> 2-> 3-> 4-> 5, dove 1 è la radice. 2 dovrebbe ottenere l'etichetta 1, ma tu dai 3? O per bambini intendi i vicini? Da quale nodo iniziamo il dfs da allora?
Knoothe il

La mia implementazione è "off by one", ma secondo la tua descrizione, dovrebbe ottenere l'etichetta , poiché devi rimuovere , quindi , quindi , e solo allora diventa una foglia. 245432
Yuval Filmus,

Non ho posto la domanda :-). Ho interpretato la domanda come: un albero non diretto. Etichetta tutte le foglie. Eliminali. Recurse sull'albero risultante. In tal caso l'albero è in realtà 1-2-3-4-5, Passaggio 1, si eliminano 1 e 5, quindi 2 e 4 e quindi 3. Vedere il paragrafo "grafico a corona". Questo è uno degli algoritmi classici per trovare il centro di un albero.
Knoothe il

1 non è una foglia. È molto lontano dall'essere una foglia, è la radice. Ho interpretato la domanda come bersaglio di alberi radicati. Forse dovremmo aspettare che il PO risponda.
Yuval Filmus,

2
@YuvalFilmus, solo per buttare dentro i miei 2 centesimi, non dovrebbe essere ? Le foglie sono , se le elimini allora le nuove foglie dovrebbero essere , quindi è una specie di misura di quanti strati devi eliminare prima che il vertice diventi una foglia. Con min, qualsiasi vertice adiacente ad una foglia ottiene 2, ma potrebbe non diventare una foglia quando le foglie vengono eliminate. Quella frase conteneva troppe foglie. Ho bisogno di una scopa. 1+max{d(u)}12
Luke Mathieson,

2

Una risposta semplice è la seguente:

  • Trasformalo in un grafico diretto, in cui abbiamo un bordo da ciascun nodo alla sua madre principale . Si noti che si ottiene un dag (grafico aciclico diretto).(u,v)uv

  • Ordinare topologicamente il grafico.

  • Scansiona i vertici, in ordine ordinato. Etichetta ogni vertice con uno in più rispetto alla più grande delle etichette sui suoi predecessori. Poiché stiamo eseguendo la scansione in ordine topologico, tutti i predecessori di avranno già ricevuto un'etichetta prima di provare a etichettare .vv

Ognuno di questi passaggi può essere eseguito in tempo, quindi il tempo di esecuzione totale è . Cito questo approccio alternativo solo nel caso in cui lo trovi concettualmente più semplice da comprendere rispetto alla risposta di Yuval.O(n+m)O(n+m)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.