Ein Dictionary-Typ mit einer definierten Reihenfolge von Schlüsseln

8

Ich möchte einen Typ verwenden, der sich wie eine einfache Liste von Paaren [(a,b)] verhält, die als Wörterbuch dienen und Schlüssel vom Typ a auf Werte vom Typ b abbilden, während ein "benutzerdefinierter" Wert beibehalten wird. , definierte Reihenfolge der Schlüssel. (also wie bei gewöhnlichen Listen - ich würde gerne ein Element "anhängen" können, das dann als "letztes Element" erkannt wird.) Ich möchte jedoch eine zufällige Zugriffssuche auf Keys mit besser als linearer Performance, also was Data.Map bietet. Eine Option wäre, neben einer Liste von Schlüsseln, die ihre Reihenfolge definieren, lediglich eine gewöhnliche Karte beizubehalten:

%Vor%

und definieren Sie dann append -Operationen usw., die die beiden Schlüsselsammlungen synchron halten. Es scheint jedoch hässlich, zwei getrennte Sammlungen derselben Schlüssel zu verwalten. Gibt es einen vorgefertigten Datentyp, der bereits geordnete Schlüssel mit effizienter Random-Access-Suche nach Schlüssel kombiniert?

    
gcbenison 08.06.2012, 01:23
quelle

3 Antworten

4

Sieh dir ixset library an - es erlaubt dir, Sätze zu verwalten, die durch mehrere Spalten indiziert sind (in deinem Fall von a und von Int ). Dies ist viel wartungsfreundlicher als Karten von Hand konsistent zu halten

    
nponeccop 08.06.2012 09:05
quelle
3

Sofern ich Ihre Frage nicht völlig falsch verstanden habe, tut Data.Map genau das, indem er die Ord -Instanz des Schlüsseltyps für die Bestellung verwendet. Da es sich um einen Binärbaum handelt, enthält die Implementierung auch die bestellten Schlüssel.

Data.Map.keys gibt Ihnen die Schlüssel einer Karte in aufsteigender Reihenfolge; Da Transformationen, wie zum Beispiel map , einer Map rein funktional sind, ist die Reihenfolge der Traversierung irrelevant, und alle Möglichkeiten, eine Folge von Schlüsseln oder Schlüssel / Wert-Paaren aus einer Map zu erhalten, ergeben eine geordnete Liste.

    
valderman 08.06.2012 06:50
quelle
3

Wenn Sie nur eine feste Reihenfolge (z. B. die Einfügezeit) beibehalten und zusätzlich O (log n) suchen / einfügen möchten, können Sie einfach mehrere Maps verwenden und diese gleichzeitig aktualisieren:

  1. Map a b zum Speichern der eigentlichen Daten und
  2. Map Int a , die Ihnen den i-ten Schlüssel in der Reihenfolge gibt. (Wenn Sie auch den Index eines bestimmten Schlüssels abfragen müssen, können Sie ein Map a Int hinzufügen)
Peter 08.06.2012 07:29
quelle

Tags und Links