Domanda

versione corta: In un albero (non binario) con molti livelli di bambini, in cui ogni nodo può avere foglie multiple, qual è il modo migliore per foglie maliziose che soddisfano una determinata condizione assegnata un nodo?

Versione lunga e contorta: Dì che hai cartelle, che possono contenere più cartelle. Nella produzione, il mio sistema ha circa 15 strati di cartelle nel più profondo. Ogni cartella potrebbe avere documenti.

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

Proprio ora sto iterando su tutte le cartelle> sottocartelle> ecc> bambini per controllare la voce della storia e in modo ricorsivo 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 questi è il migliore.

Opzione 1 : Ogni volta che aggiunge un documento o la rimozione di un documento, itera il grafico principale e incrementare / decrementare una proprietà "DocumentCount" memorizzata nell'entità della cartella. Ciò significa che l'aggiunta / rimozione prende un colpo minimo di prestazioni. Ma il problema qui è che sono effettivamente necessario contare il numero totale di documenti, oltre al numero totale di documenti contrassegnati (controllando le voci della cronologia), in modo che ciò avrò bisogno di un altro campo e un altro processo da chiamare quando questo Modifiche allo stato. Ciò introduce ancora più complessità come verificare se qualcosa sia contrassegnato o meno è una chiamata di metodo, non una proprietà.

Opzione 2: Avere un lavoro timer Eseguire e aggiornare e aggiornare le proprietà "Documentount" e "UnopenedDocumentCount" di ciascuna cartella nel sistema, sarebbe un sacco di cicli della CPU e sembra spreco.

Opzione 3 : Ho appena pensato a questo - forse iscrivendo su ogni documento e vedere se il documento è un figlio diretto o distante del nodo di destinazione prima di valutare sarebbe meglio che la recupero della recupero. Sento che questo sarebbe meglio per i nodi in alto nell'albero, ma iterando su ogni bambino per un nodo di basso livello sarebbe ridicolo. Hmmm ...

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

È stato utile?

Soluzione

Se si conosce la condizione (s) che si desidera tally quando si aggiunge il nodo all'albero, è possibile progettare la tua routine di aggiunta per ripresentarsi attraverso l'albero, invece di stendere il basso, quindi rilassati le ricorsioni e l'aggiornamentoi racconti nei nodi genitore.

Allo stesso modo, mentre aggiorni i nodi, si ripresenta a loro, e poi rilasciò le ricorsioni e aggiorna i genitori.

Se non conosci le condizioni in anticipo, sei avvitato.Non hai altra scelta che attraversare l'albero in qualsiasi ordine abbia senso.Da quello che hai detto, sembra che qualunque cosa tu stia facendo in un nodo sia una funzione dell'unità dei sottosuolo sinistro e destro, il che rende un postoporder traverse sembra la risposta giusta.

Nota: se quanto sopra non ha senso per te, leggere Knuth Vol.1 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
scroll top