Sto cercando di superare uno degli esercizi di "Purely Functional Data Structures" di Okasaki, dove presenta un numero binario zeroless come struttura per l'elenco di accesso casuale e chiede di
9.6 Show that
lookup
andupdate
on element i now run in O(log i) time.
"now" qui contrasta la rappresentazione zeroless con un semplice elenco di accessi randomizzati con albero binario, per il quale il tempo di ricerca e aggiornamento è stato stimato come O (log n) .
L'approccio in entrambi i casi è simile: manteniamo una lista di "cifre" Contro, con ogni cifra diversa da zero contenente un albero di dimensioni corrispondente al peso della cifra. L'elenco nel suo complesso è una rappresentazione binaria (o binario zeroless) del numero di elementi nell'elenco.
Ad esempio, un elenco di 6 elementi, [1, 2, 3, 4, 5, 6]
(binario per 6 è 111, zeroless binario è 22) avrà l'aspetto di
[
Zero,
One(Node(Leaf(1), Leaf(2)),
One(Node(Node(Leaf(3), Leaf(4)), Node(Leaf(5), Leaf(6))))
]
in binario o
[
Two(Leaf(1), Leaf(2)),
Two(Node(Leaf(3), Leaf(4)), Node(Leaf(5), Leaf(6))
]
nella rappresentazione binaria zeroless. Ora, lookup
e update
volte sono definite dal tempo che trascorri a localizzare l'albero con l'elemento i -th e dal tempo che passi a percorrere la struttura.
Quello che non capisco è perché loookup di i l'elemento in una lista di accesso casuale binaria richiede O (log n) piuttosto che O (log i) ? Abbiamo bisogno di localizzare l'albero che contiene l'elemento i - che è O (log i) , la navigazione all'interno dell'albero è limitata da O (log w) , dove w è la dimensione dell'albero, che è chiaramente inferiore a i * 2 .
Cosa mi manca?