Ich habe eine Teilmenge der einfachen Pfade in einem Diagramm. Die Länge der Pfade wird durch .
Was ist die kompakteste Art (speichertechnisch), wie ich die Pfade so darstellen kann, dass außer den ausgewählten Pfaden keine anderen Pfade dargestellt werden?
Beachten Sie, dass ich diese Darstellung in einem Algorithmus verwenden möchte, der diese Teilmenge von Pfaden immer wieder durchläuft, und dass ich ziemlich schnell sein möchte, sodass ich beispielsweise keine Standardkomprimierungsalgorithmen verwenden kann.
Eine Darstellung, die mir in den Sinn kam, war die Darstellung als eine Reihe von Bäumen. Ich vermute aber, dass es NP-schwer ist, es auf eine optimale Anzahl von Bäumen zu bringen? Welche anderen Darstellungen wären gut?
Antworten:
Ein Trie könnte den Trick machen: http://en.wikipedia.org/wiki/Trie
Beschriften Sie jede Kante Ihres Diagramms mit einem Buchstaben. Fügen Sie dann die Zeichenfolgen, die Pfade durch Ihr Diagramm darstellen, zum Versuch hinzu. Um die Anforderung zu erfüllen, dass "außer den ausgewählten Pfaden keine anderen Pfade dargestellt werden", können Sie alle Scheitelpunkte des Versuchs leer lassen und die Kanten beschriften, es sei denn, die von der Wurzel zum Scheitelpunkt führenden Kanten stellen dann einen Ihrer Pfade dar Beschriften Sie den Scheitelpunkt mit etwas. Ein Bool, die Nummer des Pfades unter einer bestimmten Reihenfolge usw.
Sobald Sie Ihren Versuch erstellt haben, gibt es Algorithmen, um ihn auf eine optimale (oder nahezu optimale) Darstellung zu komprimieren. (Siehe den verlinkten Wikipedia-Artikel.)
quelle
Vielleicht sollten Sie sich prägnante Datenstrukturen ansehen . Es handelt sich um Datenstrukturen, die versuchen, Informationen in einem Raum nahe der informationstheoretischen Untergrenze zu speichern, während die Fähigkeit erhalten bleibt, Operationen an ihnen durchzuführen.
Es gibt solche Strukturen für Bäume, Wörterbücher usw. Ich erinnere mich an keine, die genau das tun würden, was Sie wollen, aber vielleicht würde Ihnen eine Kombination oder Modifikation davon helfen.
quelle
Abhängig von der Komplexität und der für Ihren Algorithmus erforderlichen Vor- / Nachbearbeitung ist die einfachste Option möglicherweise der Weg. Sie können sie trivial als Arrays darstellen und in einem HDF5 komprimiert speichern. Diese Bibliothek ist mit einigen schnellen Komprimierungsalgorithmen ausgestattet, sodass das Lesen und Schreiben komprimierter Daten möglicherweise noch schneller als unkomprimiert ist.
Hier sind einige Handlungen:
Sequentielle Zugriffszeit pro Element für ein 15 GB EArray und verschiedene Blockgrößen:
Dekomprimierungsgeschwindigkeit mit Blosc auf PyTables:
Und wenn sie in der Länge begrenzt sind, können Sie sie in einem Tisch aufbewahren und so wahrscheinlich etwas mehr Platz gewinnen. Und wenn Sie sie aus dem Speicher abrufen, haben Sie sie bereits in einer sehr praktischen Form, um Ihren Algorithmus anzuwenden.
quelle