Come calcoli la complessità di tempo e spazio per un algoritmo ad albero che crea una copia di un albero, ma riutilizza il più possibile l'albero originale?
Ad esempio,
A
/|\
B C G
/|\
D E F
Per cambiare E, possiamo adottare un approccio più efficiente, piuttosto che copiare l'intero albero:
- Copia E e modifica il valore, chiama questo E '
- Copia C e puntalo su E 'invece di E, chiama questo C'
- Copia A e punta a C ', chiama A'
Il nuovo albero ha questo aspetto.
A'
/|\
B C'G
/|\
D E'F
Il tempo impiegato per gli aggiornamenti dipende completamente dal valore che si desidera modificare e dal numero di nodi padre tra esso e la radice, anziché il numero totale di elementi.
Nel peggiore dei casi, per aggiornare un nodo, devi modificare h
elementi, dove h
è l'altezza (profondità massima) dell'albero. È corretto esprimere la complessità come O(h)
(piuttosto che in termini di n
)?
In caso affermativo, quale sarebbe un modo sensato per tracciare questo grafico su un grafico che utilizzava l'asse y per n
e l'asse x
per Big O? Includere un asse secondario y
come h
? Come dimostreresti che h
è probabilmente molto più piccolo di n
?