Elabora ogni foglia sotto un nodo in un albero in modo efficiente

3

Versione breve: In un albero (non binario) con molti livelli di bambini, in cui ogni nodo può avere più foglie, qual è il modo migliore per lasciare le foglie che soddisfano una determinata condizione data un nodo?

Versione lunga e contorta: Supponi di avere delle cartelle, che possono contenere più cartelle. In produzione, il mio sistema ha circa 15 livelli di cartelle al livello più profondo. Ogni cartella può contenere documenti.

Quando un utente naviga verso una cartella, deve sapere quanti documenti ci sono in quella cartella, totale. Devono anche sapere quanti di questi documenti sono stati "segnalati". I documenti possono essere contrassegnati se, dopo un certo periodo di tempo, non sono stati aggiornati. Questo viene determinato in base alle voci della cronologia: prendi l'ultima voce della cronologia per la cartella, se è più grande di X, quindi viene contrassegnata.

In questo momento sto iterando su tutte le cartelle > sottocartelle > ecc. > i bambini controllano l'inserimento della cronologia e la ricorrenza in modo ricorsivo. Questo sta diventando piuttosto lento ora, quindi ho bisogno di un nuovo approccio.

Ho trovato due opzioni, ma voglio sapere se c'è un approccio migliore o quale di queste è la migliore.

opzione 1 : ogni volta che aggiungi un documento o rimuovi un documento, itera il grafico genitore e incrementa / decrementa una proprietà "DocumentCount" che è memorizzata nell'entità Cartella. Ciò significa che l'aggiunta / rimozione richiede un impatto minimo sulle prestazioni. Ma il problema qui è che in realtà ho bisogno di contare il numero totale di documenti, così come il numero totale di documenti che sono contrassegnati (controllando le voci della cronologia), quindi ciò significa che mi servirà un altro campo e un altro processo da chiamare quando questo cambiamenti di stato. Ciò introduce ancora più complessità nel verificare se qualcosa è contrassegnato o meno è una chiamata al metodo, non una proprietà.

opzione 2: Far eseguire un processo timer e aggiornare le proprietà "documentCount" e "unopenedDocumentCount" di ogni cartella del sistema, sarebbe un sacco di cicli della CPU e sembra uno spreco.

opzione 3 : pensavo a questo: forse iterando su ogni documento e vedendo se il documento è un figlio diretto o distante del nodo di destinazione prima di valutare sarebbe meglio che iterare tramite ricorsione. Credo che sarebbe meglio per i nodi in alto nell'albero, ma scorrere su ogni bambino per un nodo di basso livello sarebbe ridicolo. Hmmm ...

Sono tentato di implementare l'opzione 1 .. quali altre opzioni ci sono?

    
posta SB2055 16.07.2013 - 02:12
fonte

1 risposta

5

Se si conosce la / le condizione / e che si desidera calcolare quando si aggiunge il nodo all'albero, è possibile progettare la routine di aggiunta per ricorrere nuovamente attraverso la struttura, anziché scendere semplicemente, quindi svolgere le ricorsività e aggiornare i racconti nei nodi genitori.

Allo stesso modo, quando aggiorni i nodi, ricorri a loro, quindi disattiva le ricorsioni e aggiorna i genitori.

Se non conosci le condizioni in anticipo, sei fregato. Non hai altra scelta che attraversare l'albero in qualsiasi ordine abbia senso. Da quello che hai detto, sembra che qualsiasi cosa tu stia facendo su un nodo è una funzione del qualunque dei sottoalberi sinistro e destro, che fa sembrare che una traversa postorder sia la risposta giusta.

Nota: se quanto sopra non ha senso per te, leggi Knuth vol. 1 .

    
risposta data 16.07.2013 - 04:36
fonte

Leggi altre domande sui tag