C'è una struttura di dati chiamata treap: si tratta di un albero di ricerca binario randomizzato, che è anche un mucchio di cosiddette "priorità" generate casualmente.Treap con chiavi implicite
C'è una variazione di questa struttura, dove le chiavi sono implicite, non sono memorizzate nell'albero, ma consideriamo l'indice ordinato del nodo nell'albero come la chiave di questo nodo. Abbiamo bisogno di memorizzare la dimensione della sottostruttura in ogni nodo anziché la chiave. Questa tecnica ci consente di pensare a treap come una sorta di array, che supporta molte operazioni nel tempo O (log N): inserimento, cancellazione, reversione di subarray, cambio di intervallo e così via.
Conosco un po 'di questa struttura, ma non così tanto. Ho provato a google, ma ho trovato solo un sacco di articoli su Treap, ma nulla su questa "lista implicita"/"elenco indicizzato". Non conosco nemmeno il suo nome, perché la mia lingua madre non è l'inglese e la lezione che ho ascoltato usava il termine nativo di struttura, non il termine originale inglese. Questo termine nativo può essere tradotto direttamente in inglese come "Treap on the implicit keys" o "Cartesian tree on the implicit keys".
Qualcuno può indicarmi l'articolo su questa struttura o dirmi il suo nome originale? Grazie.
P.S. Scusa se il mio inglese non era abbastanza comprensibile.
UPD: Qualche spiegazione in più sulla struttura che sto cercando.
Considera un consueto trionfo con priorità e chiavi scelti a caso, che sono dati utente reali memorizzati nell'albero. Immaginiamo di avere qualche altra informazione utente memorizzata in ogni nodo, e le chiavi non sono altro che le chiavi di ricerca. Il passo successivo è il calcolo e il mantenimento della dimensione del sottostrato in ogni nodo: dobbiamo aggiornare questo parametro dopo ogni unione/divisione/Aggiungi/Rimuovi, ma ci permette di trovare, per esempio, l'elemento Kth dell'albero in O (log N) tempo.
Quando abbiamo le dimensioni di sottostruttura in ogni nodo, possiamo gettare via le chiavi e immaginare che treap rappresenti una serie di dati utente in attraversamento inorder. L'indice di matrice di ciascun elemento può essere facilmente calcolato da dimensioni di sottostruttura. Ora possiamo aggiungere/rimuovere un elemento nel mezzo della matrice o dividere questo array - tutto in tempo O (log N).
Possiamo anche eseguire un'operazione "multipla", ad esempio aggiungere un valore costante a tutti gli elementi del nostro "array". Per implementare questa operazione, dobbiamo ritardare questa operazione, aggiungere un parametro in ogni nodo che rappresenta una costante ritardata che deve essere "successivamente" aggiunta a tutti gli elementi del sottoarray di questo nodo e "spingere" le modifiche verso l'alto come necessario. Aggiungendo una costante al sottoarray o alla pittura (marcatura) il subarray può essere ritardato in questo modo, invertendo il subarray (qui le informazioni ritardate nel nodo nel bit "subarray deve essere invertito"), e così via.
UPD2: Ecco il numero code snippet - parte della piccola quantità di informazioni che ho trovato. Non notare cirillico :) Le parole "с неявным ключом" significano nella traduzione diretta "con chiave implicita".
Sto parlando esattamente di treap, non randomized BST. Come ho visto, treap ha le chiavi e le priorità: la chiave è i dati utente effettivi memorizzati nell'albero e la priorità è un parametro interno scelto casualmente. Treap è BST sulle chiavi e accumula simultaneamente sulle priorità. Sono ucraino, ho tenuto una conferenza in russo, docente - Vitaly Goldstein, vincitore della medaglia ACM ICPC, ex stagista di Google, attualmente lavora presso Yandex. La lezione è stata ascoltata alla scuola di programmazione ACM invernale di Kharkov, se lo sai. Condividerò alcune spiegazioni aggiuntive su questa struttura nell'UPD del mio post. – Skiminok
@Skiminok Sono interessato a un articolo di questa tecnica. Per favore potresti mandarmi un link se ce l'hai a portata di mano? Grazie! – dhruvbird
@dhruvbird Il documento originale sia su treap che su BST randomizzati è http://people.ischool.berkeley.edu/~aragon/pubs/rst96.pdf. Ma descrive solo la definizione e le operazioni di base. Ho letto tutto il materiale sui treap e le loro applicazioni di cui sono a conoscenza (compresi i treap con chiavi implicite) nella serie di tre articoli: [# 1] (http://habrahabr.ru/blogs/algorithm/101818/), [# 2] (http://habrahabr.ru/blogs/algorithm/102006/), [# 3] (http://habrahabr.ru/blogs/algorithm/102364/). Solo russo, purtroppo. – Skiminok