2015-04-07 15 views
20

Scala ha una collezione TrieMap.Cos'è una TrieMap e quali sono i suoi vantaggi/svantaggi rispetto a una HashMap?

Che cos'è un TrieMap e quali sono i suoi vantaggi/svantaggi rispetto a un HashMap?

+0

O forse: http://stackoverflow.com/questions/18660769/best-practices-for-mixing-in-scala-concurrent-map –

+1

Decisamente non un duplicato. Il più grande vantaggio è che Scala TrieMaps fornisce iteratori efficienti e coerenti che catturano tutti gli elementi nel trie in un determinato momento. – axel22

risposta

20

A Scala TrieMap è un basato su trie implementazione mappa scalabile. A differenza delle normali mappe trie, Scala TrieMap ha un'operatività efficiente, non bloccante, con O (1) tempo snapshot (e un'operazione leggermente ottimizzata readOnlySnapshot).

prestazioni assoluta di una TrieMap è leggermente al di sotto della JDK8 ConcurrentHashMap, ma il vantaggio è che fornisce iteratori coerenti, qualcosa che le strutture di dati simultanei in genere non hanno. Ciò significa che è possibile acquisire tutti gli elementi nel trie in un determinato momento (numero di prestazioni e analisi here). Dovresti utilizzare lo TrieMap se è necessario acquisire tutti gli elementi contemporaneamente (ad esempio elencare tutti i suoi elementi nell'interfaccia utente o analizzarli in modo coerente).

+1

Leggermente non correlato, ma è disponibile una porta open source della scala TrieMap in Java disponibile: https://github.com/romix/java-concurrent-hash-trie-map. – Pinch

19

TrieMaps sono mappe che utilizzano la struttura di dati che sono essenzialmente alberi poco profondi. Ad esempio, se si dispone di un hash a 32 bit lo si suddivide in sezioni, ad esempio 4 volte 8 ea ogni livello dell'albero si dirama fino a 256 sub-alberi. Ovviamente questo dà prestazioni O (1) a causa delle dimensioni fisse dell'hash (assumendo poche collisioni).

Una struttura trie può essere resa immutabile in modo efficace, riutilizzando la struttura di un trie per creare un nuovo trie con un elemento aggiunto o rimosso. Le prestazioni relative all'effetto memoria/tempo su GC dipendono molto dall'implementazione e dal caricamento, quindi piuttosto tentare una risposta generica, direi eseguire un benchmark. Sebbene per un singolo thread senza requisiti di immutabilità, una hashmap classica normalmente produrrà prestazioni medie migliori e prestazioni peggiori nel caso peggiore.

Come nota a margine, menzionerò poiché il trieMap usa anche un hash, è anche un hashmap, quindi mi raccomando di chiamarlo hashmap con backed di trie backed array.

Problemi correlati