Cosa c'è di nuovo nelle strutture di dati puramente funzionali da Okasaki?


563

Dal libro di Chris Okasaki del 1998 "Strutture di dati puramente funzionali", non ho visto troppe nuove interessanti strutture di dati puramente funzionali; Posso citarne solo alcuni:

  • IntMap (inventato anche da Okasaki nel 1998, ma non presente in quel libro)
  • Alberi da dito (e loro generalizzazione su monoidi)

Esistono anche alcuni modi interessanti di implementare strutture di dati già note, come l'uso di "tipi nidificati" o "tipi di dati algebrici generalizzati" per garantire invarianti di alberi.

Quali altre nuove idee sono apparse dal 1998 in questo settore?


20
Bella domanda Ho appena avuto uno studente che mi chiedeva questo e non conoscevo la risposta.
Suresh Venkat,

Questo va bene per qui, ma potresti ottenere risposte migliori su Stack Overflow. Se chiedi lì, assicurati e link alla discussione qui.
Charles Stewart,

3
Bene, l'Haskell Reddit l'ha visto, quindi ci saranno anche delle buone risposte, ma una domanda eccellente. Solo a metà del libro di Okasaki mi chiedevo lo stesso, penso io stesso. +1
Robert Massaioli,


Risposte:


553

Nuove strutture di dati puramente funzionali pubblicate dal 1998:

Noto nel 1997, ma non discusso nel libro di Okasaki:

  • Molti altri stili di albero di ricerca bilanciato . AVL, Brother, Rango bilanciato, Rilegato al limite e molti altri alberi di ricerca bilanciata possono essere (e sono stati) implementati in modo puramente funzionale mediante la copia del percorso. Forse meritevoli di menzione speciale sono:

    • Alberi di ricerca distorta , di Samuel W. Bent, Daniel D. Sleator e Robert E. Tarjan : un elemento chiave nel documento di Brodal et al. Del 2006 e in quello di Demaine et al. Del 2008.
  • Set infiniti che ammettono ricerche veloci ed esaustive , di Martín Escardó : forse non una struttura di dati in .

  • Tre algoritmi su Braun Tree , di Chris Okasaki : Gli alberi Braun offrono molte operazioni di stack nel caso peggiore O (lg n). Questo limite è superato da molte altre strutture di dati, ma gli alberi Braun hannoconsun'operazione pigra nel suo secondo argomento, e quindi possono essere usati come stack infiniti in alcuni modi che altre strutture non possono.

  • L'heap min-max rilassato: una coda di priorità a doppia estremità unificabile e L'heap di KD: Una coda di priorità multidimensionale efficiente , di Yuzheng Ding e Mark Allen Weiss : Questi sono puramente funzionali, anche se questo non è discusso nei documenti . Non credo che i limiti di tempo raggiunti siano migliori di quelli che possono essere raggiunti usando gli alberi delle dita (di Hinze & Paterson o Kaplan e Tarjan) come code prioritarie k-dimensionali, ma penso che le strutture di Ding & Weiss utilizzino meno spazio .

  • The Zipper , di Gérard Huet : utilizzato in molte altre strutture di dati (come gli alberi delle dita di Hinze & Paterson), questo è un modo per capovolgere una struttura di dati.

  • Gli elenchi delle differenze sono elenchi catenabili O (1) con una trasformazione O (n) in conselenchi normali . Apparentemente sono noti fin dall'antichità nella comunità Prolog, dove hanno una trasformazione O (1) in normali consliste. La trasformazione O (1) sembra essere impossibile nella programmazione funzionale tradizionale, ma l'astrazione del foro di Minamide , da POPL '98, discute un modo per consentire la trasformazione O (1) append e O (1) all'interno della pura programmazione funzionale. A differenza delle solite implementazioni di programmazione funzionale degli elenchi di differenze, che si basano su chiusure di funzioni, le astrazioni dei fori sono essenzialmente le stesse (sia nel loro uso che nella loro implementazione) degli elenchi di differenze Prolog. Tuttavia, sembra che per anni l'unica persona che lo abbia notatouno dei recensori di Minamide .

  • I dizionari rappresentati in modo univoco supportano l'inserimento, l'aggiornamento e la ricerca con la restrizione che nessuna struttura contenente gli stessi elementi può avere forme distinte. Per fare un esempio, gli elenchi ordinati singolarmente collegati sono rappresentati in modo univoco, ma gli alberi AVL tradizionali no. Anche i tentativi sono rappresentati in modo univoco. Tarjan e Sundar, in "Rappresentazioni binarie uniche dell'albero di ricerca e test di uguaglianza di insiemi e sequenze" , hanno mostrato un dizionario rappresentato in modo univoco puramente funzionale che supporta le ricerche nel tempo logaritmico e gli aggiornamenti nel tempo . Tuttavia, utilizza lo spazio . Esiste una rappresentazione semplice che utilizza gli alberi Braun che utilizza solo spazio lineare ma ha un tempo di aggiornamento diO(n)Θ(nlgn)Θ(nlgn) e tempo di ricerca diΘ(lg2n)

Strutture di dati per lo più funzionali, prima, durante e dopo il libro di Okasaki:

  • Molte procedure per rendere le strutture di dati persistenti, pienamente persistenti o persistentemente confluenti : Haim Kaplan ha scritto un eccellente sondaggio sull'argomento . Vedi anche sopra il lavoro di Demaine et al., Che dimostrano un array completamente persistente nello spazio (dove è il numero di operazioni mai eseguite sull'array) e tempo di accesso previsto.O(m)mO(lglgn)

  • 1989: Alberi di ricerca randomizzati di Cecilia R. Aragon e Raimund Seidel : questi sono stati discussi in un ambiente puramente funzionale da Guy E. Blelloch e Margaret Reid-Miller in Operazioni rapide con Treaps e da Dan Blandford e Guy Blelloch in Operazioni funzionali in serie con Treaps ( codice). Forniscono tutte le operazioni di fingertree puramente funzionali e alberi di ricerca distorti, ma richiedono una fonte di casualità, rendendole non puramente funzionali. Ciò può anche invalidare la complessità temporale delle operazioni sui trattati, presupponendo che un avversario possa cronometrare le operazioni e ripetere quelle lunghe. (Questo è lo stesso motivo per cui gli argomenti di ammortamento imperativo non sono validi in un'impostazione persistente, ma richiede un avversario con un cronometro)

  • 1997: Skip-tree, una struttura di dati alternativa alle Skip-list in un approccio concorrente , di Xavier Messeguer ed Exploring the Duality Between Skip Lists and Binary Search Trees , di Brian C. Dean e Zachary H. Jones : le Skip List non sono puramente funzionali, ma possono essere implementati funzionalmente come alberi. Come i melodi, richiedono una fonte di bit casuali. (È possibile rendere deterministiche le liste di salto, ma, dopo averle tradotte in un albero, penso che siano solo un altro modo di guardare 2-3 alberi.)

  • 1998: Tutte le strutture ammortizzate nel libro di Okasaki! Okasaki ha inventato questo nuovo metodo per mescolare l'ammortamento e le strutture di dati funzionali, che in precedenza erano ritenuti incompatibili. Dipende dalla memoizzazione che, come hanno già detto Kaplan e Tarjan, è in realtà un effetto collaterale. In alcuni casi ( come PFDS su SSD per motivi di prestazioni ), questo potrebbe essere inappropriato.

  • 1998: semplici elenchi catenabili persistentemente confluenti , di Haim Kaplan, Chris Okasaki e Robert E. Tarjan : usa la modifica sotto il cofano per dare deques ammortizzabili O (1) ammortizzate, presentando la stessa interfaccia di una precedente (puramente funzionale, ma con memoizzazione ) versione che appare nel libro di Okasaki. Kaplan e Tarjan avevano precedentemente creato una struttura puramente funzionale O (1) nel caso peggiore, ma è sostanzialmente più complicata.

  • 2007: come menzionato in un'altra risposta in questa pagina, strutture di dati semi-persistenti e ritrovamento sindacale persistente di Sylvain Conchon e Jean-Christophe Filliâtre

Tecniche per la verifica delle strutture di dati funzionali, prima, durante e dopo il libro di Okasaki:

Strutture o analisi di dati imperative non discusse nel libro di Okasaki, ma correlate a strutture di dati puramente funzionali:

  • The Soft Heap: una coda di priorità approssimativa con tasso di errore ottimale , di Bernard Chazelle : questa struttura di dati non utilizza array e quindi ha tentato prima il canale IRC #haskell e successivamente gli utenti Stack Overflow , ma includedeletein o (lg n) , che di solito non è possibile in un contesto funzionale e un'analisi imperativa ammortizzata, che non è valida in un contesto puramente funzionale.

  • Alberi di ricerca binari bilanciati con aggiornamenti delle dita O (1) . Nel rendere persistenti le strutture di dati , James R Driscoll, Neil Sarnak, Daniel D. Sleator e Robert E. Tarjan presentano un metodo per raggruppare i nodi in un albero rosso-nero in modo che gli aggiornamenti persistenti richiedano solo spazio O (1). I deques e gli alberi delle dita puramente funzionali progettati da Tarjan, Kaplan e Mihaescu utilizzano tutti una tecnica di raggruppamento molto simile per consentire gli aggiornamenti O (1) ad entrambe le estremità. Gli alberi AVL per la ricerca localizzata di Athanasios K. Tsakalidis funzionano in modo simile.

  • Cumuli di accoppiamento più veloci o limiti migliori per cumuli di accoppiamenti : da quando è stato pubblicato il libro di Okasaki, sono apparse diverse nuove analisi di cumuli di accoppiamento imperativi, tra cui l' associazione di cumuli con O (registro n) diminuiscono il costo di Amr Elmasry e Verso un'analisi finale di accoppiamento di cumuli di Seth Pettie. Potrebbe essere possibile applicare parte di questo lavoro ai mucchi pigri di accoppiamento di Okasaki.

  • Alberi di dita deterministici e distorti : negli elenchi Skip distorti , di Amitabha Bagchi, Adam L. Buchsbaum e Michael T. Goodrich, viene presentato un disegno per skip list deterministici. Tramite la skip list / trasformazione dell'albero menzionata sopra, potrebbe essere possibile creare alberi di ricerca distorti deterministici. Gli elenchi salta di dito distorti descritti da John Iacono e Özgür Özkan in Mergeable Dictionaries potrebbero quindi essere possibili su salti di parte distorti. Un albero di dita di parte è suggerito da Demaine et al. nel loro articolo sui tentativi puramente funzionali (vedi sopra) come un modo per ridurre i limiti di spazio e tempo sull'aggiornamento delle dita nei tentativi.

  • Il String B-Tree: una nuova struttura di dati per la ricerca di stringhe nella memoria esterna e le sue applicazioni di Paolo Ferragina e Roberto Grossi è una struttura di dati ben studiata che combina i vantaggi di try e B-tree.


5
Non ricordo di aver spuntato la casella "wiki comunità" su questa risposta. C'è un modo per annullarlo?
jbapple,

7
@jbapple: dopo un certo numero di modifiche, tutti i post diventano wiki della community. Questa è una recensione straordinariamente approfondita lì. Grazie.
Phil Miller,

29
Ottima lista! Il che mi fa desiderare che Okasaki pubblichi una seconda edizione.
Radu GRIGore,

4
Notare che Isabelle / HOL può generare codice per SML, OCaml, Haskell, Scala. Lo strumento Haskabelle può anche importare Haskell in Isabelle / HOL.
Makarius

2
La terminologia di "estrazione programmata" è una delle Coq: prendi una prova costruttiva e ne fai un programma eseguibile, togliendo alcune cose. In Isabelle questo si chiama "generazione di codice" e funziona in modo diverso, usando le specifiche HOL come pseudo-codice, non le prove. L'estrazione di prove in Isabelle / HOL secondo Berghofer funziona come Coq, ma oggigiorno viene usata raramente.
Makarius,

63

Alle note eccellenti già fatte, aggiungerò le cerniere .

Huet, Gerard. “Functional Pearl: The Zipper” Journal of Functional Programming 7 (5): 549-554, settembre 1997.

Wikipedia: Zipper (struttura dati)


4
Le cerniere sono FANTASTICHE. Per molti casi d'uso, consentono alle rappresentazioni basate su alberi di diventare la scelta "giusta" per molti tipi di dati, dove altrimenti sarebbe un po 'più complicato
Carter Tazio Schonwald,

1
Un esempio del loro uso per la manipolazione XML: anti-xml.org/zippers.html
Lumaca meccanica

40

Caspita, UNIONE-TROVA persistente! Grazie!
jkff,

3
Beh, in un certo senso ... Vedi l'articolo.
Radu GRIGore,

1
... o, se preferisci, vedi un po 'di codice (di Matt Parkinson) github.com/septract/jstar/blob/master/src/utils/…
Radu GRIGore

5
Ora vedo perché il commento "tipo di .." ha avuto un voto positivo. Hanno buone prestazioni solo quando non si utilizza quasi esclusivamente la persistenza o si fa sempre il backtrack: se si utilizzano spesso entrambe le versioni "nuova" e "vecchia", si è fregati. Bella idea di reindirizzamento però.
jkff,

Il link di Radu ora può essere trovato su github.com/septract/jstar-old/blob/…
jbapple,


14

Rangemaps

È una struttura di dati specializzata, ma può essere utilizzata come sostituto della DIET di Martin Erwig, con proprietà leggermente diverse, quindi almeno esiste una struttura di dati esistente per confrontarla. La DIET stessa è stata descritta in un articolo su JFP nel 1998, quindi forse non è inclusa in Strutture di dati puramente funzionali.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.