Quali sono le domande in sospeso in strutture di dati puramente funzionali?


51

Questa domanda è ispirata da un'altra domanda sulle novità di PFDS dalla pubblicazione del libro di Okasaki nel 1998 .

Inizierò con due domande che ho:

  • Esiste una struttura di dati di set puramente funzionale che si avvicina alla velocità delle tabelle hash? I tentativi non ci sono ancora.
  • Esistono alberi di dita puramente funzionali con appendice O (1)? Il migliore finora è O (lg lg n), ideato da Kaplan e Tarjan.

Quali altri problemi di struttura dei dati puramente funzionali sono aperti?


Presumo che tu voglia provare come negli hash tree piuttosto che nei dizionari più generali con chiavi che sono sequenze? FWIW, penso che sia impossibile avvicinarsi al buon vecchio tavolo di hash qui.
Jon Harrop,

Risposte:


19

Interpreterò la domanda in modo un po 'liberale. Per le strutture di dati in stile Okasaki, la memoizzazione è una forma di mutazione implicita che ha un effetto collaterale sul tempo di esecuzione. Quindi prenderò la questione di interessare le strutture di dati persistenti in senso stretto piuttosto che le strutture di dati con un'implementazione puramente funzionale, che sono un sottoinsieme del primo. Con rigoroso intendo che dovresti essere in grado di accedere alle versioni precedenti di una struttura di dati senza penalità, l'albero delle versioni può ramificarsi arbitrariamente, ecc.

In tale contesto, considero UNION-FIND persistente un importante problema aperto. C'è la carta Conchon-Filliâtre menzionata nell'altro thread. Un commentatore ha già sollevato un problema con il suo cosiddetto array persistente: in realtà è solo semi-persistente. Ma supponi di sostituirlo con un hash trie o qualche altro array veramente persistente che si comporta meglio nel caso peggiore (e probabilmente nella media) ma peggio nel migliore dei casi. Ciò lascia ancora aperto un problema importante:

Il documento fornisce una prova formale di correttezza in Coq. Ma non riescono ad affrontare la complessità ammortizzata in modo formale o informale. E 'molto non è chiaro per me che il complicato dietro le quinte mutazione provoca la complessità ammortizzato previsto in tutti i casi. L'ultima volta che ci ho pensato, mi sentivo un po 'fiducioso di poter costruire un controesempio se ci mettessi uno sforzo. Anche se mi sbaglio su quest'ultima parte, la mancanza di un'analisi adeguata è un grande divario; è chiaro che l'analisi classica di ammortamento di Traiano di UNION-FIND non viene trasferita direttamente.


5
Un candidato per array completamente persistenti (ma non confluentemente persistenti) è presentato in Confluently Persistent Tries for Efficient Version Control . Gli autori sostengono il rallentamento di O (lg lg n), battendo il rallentamento di O (lg lg m) di Dietz et al, dove m è il numero di operazioni che sono state eseguite sull'array.
jbapple,

1
Aggiungerò anche che, sebbene le strutture pigre ammortizzate di Okasaki siano spesso molto più semplici delle alternative, non conosco alcuna struttura di dati che possa essere implementata in quel modo che non può essere implementata (con gli stessi limiti di tempo, ma nel peggiore dei casi) in un modo veramente puramente funzionale.
jbapple,

12

Quali altri problemi di struttura dei dati puramente funzionali sono aperti?

Eccone uno:

Qual è l'equivalente puramente funzionale di una tabella hash debole?


15
um .... l'OP ha posto domande senza risposta, quindi ciò si qualificherebbe come potenziale risposta alla domanda dell'OP.
Jason S,

6
Ok, ti ​​mordo. Che cos'è una tabella hash debole?
Jeffε

4
È una tabella hash che consente di raccogliere i suoi elementi in modo inutile se solo esso (e altre mappe deboli) contengono riferimenti ad esso.
Havvy,

3
@JonHarrop: è facile dimostrare che una versione pura di un riferimento debole è impossibile, poiché riferimenti deboli rendono la semantica del linguaggio non deterministica e i linguaggi puramente funzionali sono deterministici. Se si contrassegna ulteriormente il non determinismo nel tipo, la normale implementazione funziona. Sono necessari tipi dipendenti (per dimostrare che un'implementazione fornisce le stesse risposte indipendentemente dal contenuto del riferimento) se si desidera mascherare l'effetto in modo sicuro.
Neel Krishnaswami,

5
@NeelKrishnaswami, non credo sia così. È possibile creare strutture di dati deboli che non creano non determinismo, come una tabella debole che non supporta l'enumerazione (o il conteggio). Vedi wiki.ecmascript.org/doku.php?id=harmony:weak_maps per un esempio.
Sam Tobin-Hochstadt,
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.