Copertura massima dell'albero

1

Vorrei capire quale sarebbe il metodo ottimale per trovare una copertura minima dell'albero dei nodi dell'albero. Lasciami spiegare.

Ho una struttura autoreferenziale che rappresenta un albero, con una profondità limitata di X.

Inodinell'alberopossonoesserelogicamente"selezionati". Dal punto di vista dell'applicazione, significa che l'utente vorrebbe avere alcune informazioni aggregate sulla selezione.

Diciamo che l'utente sceglie i nodi A, D, I, J, L e M.

Quellochemipiacerebbefareèessereingradodiristrutturarelaselezionedegliutentialfinediscegliereilsetminimodinodichecopronol'interaselezione.

Perquestoesempio:

    Inodi
  • IeJpossonoesserecopertidalloronodogenitorecomuneF,quindiselezionoFerimuovoIeJ
  • ilnodoMpuòesserecopertodalnodogenitoreH,quindiselezionoHerimuovoM
  • ilnodoDègiàcopertodalnodoA,quindirimuovoD

Dopodiché,nullapuòessereulteriormenteristrutturato:l'algoritmosifermaedovreiottenerelaseguenteselezione.

Perprimacosa,nonsose"copertura minima" sia il nome giusto. In secondo luogo, non riesco a trovare alcuna frase migliore, quindi Google non è il mio migliore amico qui.

Un'altra cosa da notare è che l'albero stesso può essere memorizzato:

  • in memoria
  • nel database transazionale
  • nel database OLAP (non esattamente più autoreferenziale)

Sono bloccato: (

Modifica

Ho riflettuto molto su questo problema e potrebbe esserci una soluzione che devo analizzare.

Di seguito è possibile inserire:

  • chiamiamo albero stesso "l'albero modello"
  • chiamiamo la selezione "albero di selezione"
  • ogni nodo dell'albero modello ha un attributo ridondante precalcolato - numero di nodi figli
  • l'albero di selezione può essere "sporco" o "pulito"
    • dopo che un nodo è stato aggiunto, se non è ancora stato fatto nulla, è nello stato sporco
    • dopo che la ristrutturazione è terminata, è in stato di pulizia
  • ogni nodo dell'albero di selezione ha attributi ridondanti - numero di nodi figli selezionati e stati: selezionati o fantasma
  • L'albero di selezione
  • è una variante dell'albero in doppia memoria in memoria (il bambino conosce il suo genitore, il genitore conosce i suoi figli)

Successivamente, l'aggiunta di un nodo nell'albero di selezione (nodo di selezione) funzionerebbe in questo modo. Chiamiamo il nuovo genitore del nuovo nodo nell'albero di selezione un genitore selezione e il genitore del nuovo nodo nell'albero modello un modello genitore. Chiamiamo i figli della selezione del nodo dell'albero di selezione: figli e figli del modello di nodo dell'albero modello-figli.

  1. Imposta lo stato sporco dell'albero di selezione
  2. Rimuovi tutti i child di selezione del nodo di selezione
  3. Se inesistente nell'albero di selezione, recupera template-parent del nodo di selezione, insieme al suo numero di attributi child; aggiungi selezione genitore come nodo fantasma, con il numero selezionato di bambini = 1
  4. Se esistente nell'albero di selezione, seleziona selezione-genitore del nodo di selezione e incrementa il numero selezionato di figli
  5. Se selezione genitore ha selezionato il numero di figli uguale al numero di bambini modello, promuovi il suo stato da fantasma a selezionato; considera il nodo di selezione come un nuovo nodo e inizia da 1
  6. Imposta lo stato di pulizia dell'albero di selezione

Sono curioso di sapere se questo algoritmo esiste già come un'implementazione da qualche parte. Il suo comportamento non sarebbe ovviamente peggiore di O (log (n)), giusto? Certo, se non manca qualcosa nella logica.

    
posta OzrenTkalcecKrznaric 20.11.2015 - 09:51
fonte

1 risposta

2

L'effetto desiderato può essere ottenuto con un singolo passaggio sull'albero, utilizzando una iterazione in profondità.

Quando visiti un nodo, esegui due azioni condizionali

  • se tutti i figli del nodo sono selezionati, contrassegni il nodo corrente come selezionato.
  • se il nodo corrente è selezionato, allora deseleziona tutti i figli del nodo

Nel tuo esempio, questi test lasciano che la selezione dei nodi I , J e M aumenti rispettivamente a F e H e il secondo test causi la deselezione del nodo D .

Questo algoritmo non formula alcuna ipotesi su come viene archiviato l'albero, ma presuppone solo che sia possibile raggiungere ciascun nodo e che sia possibile elaborare i figli del nodo X prima del nodo X stesso.

Se il processo è interattivo, il processo può essere ancora più semplice:

  1. Controlla se un genitore (diretto o indiretto) del nodo selezionato è già selezionato. In tal caso, deseleziona nuovamente il nodo.
  2. Se il nodo è ancora selezionato, vai sopra l'albero sotto il nodo e deseleziona tutti i figli (diretti e indiretti) del nodo.
  3. Se il nodo e tutti i suoi fratelli sono selezionati, seleziona il genitore e deseleziona i figli del genitore. Ripeti questo passaggio fino a raggiungere un nodo che non ha selezionato tutti i fratelli.

Questo è generalmente più efficiente, perché in ogni selezione di solito devi solo percorrere una piccola parte dell'albero.

    
risposta data 20.11.2015 - 12:57
fonte

Leggi altre domande sui tag