Mam podzbiór prostych ścieżek na wykresie. Długość ścieżek jest ograniczona.
Jaki jest najbardziej zwarty sposób (pod względem pamięci), w jaki sposób mogę reprezentować ścieżki, tak aby nie były reprezentowane żadne inne ścieżki oprócz wybranych?
Zauważ, że chcę użyć tej reprezentacji w algorytmie, który będzie powtarzał się przez ten podzbiór ścieżek w kółko i że chcę być dość szybki, więc na przykład nie mogę używać żadnych standardowych algorytmów kompresji.
Jedną z wyobrażeń, które przyszły mi do głowy, było przedstawienie ich jako zbioru drzew. Zgaduję jednak, że doprowadzenie do optymalnej liczby drzew jest trudne NP? Jakie inne reprezentacje byłyby dobre?
graphs
data-structures
Optować
źródło
źródło
Odpowiedzi:
Trie może załatwić sprawę: http://en.wikipedia.org/wiki/Trie
Oznacz każdą krawędź wykresu literą. Następnie dodaj ciągi, które reprezentują ścieżki przez wykres do trie. Aby spełnić wymóg „nie są reprezentowane żadne inne ścieżki oprócz wybranych”, możesz pozostawić wszystkie wierzchołki trie puste i oznaczyć krawędzie, chyba że krawędzie prowadzące od nasady do wierzchołka reprezentują jedną z twoich ścieżek, a następnie oznacz wierzchołek czymś. Wartość bool, liczba ścieżek w ramach niektórych zamówień itp.
Po zbudowaniu trie istnieją algorytmy kompresji w celu uzyskania optymalnej (lub prawie optymalnej) reprezentacji. (zobacz powiązany artykuł w Wikipedii).
źródło
Być może powinieneś rzucić okiem na zwięzłe struktury danych . Są to struktury danych, które próbują przechowywać informacje w przestrzeni blisko teoretycznej dolnej granicy, zachowując jednocześnie możliwość wykonywania na nich operacji.
Istnieją takie struktury dla drzew, słowników itp. Nie przypominam sobie żadnych, które mogłyby zrobić dokładnie to, co chcesz, ale być może niektóre ich kombinacje lub modyfikacje mogłyby ci pomóc.
źródło
W zależności od złożoności i przetwarzania wstępnego / końcowego wymaganego dla algorytmu, być może najprostszą opcją jest sposób. Możesz w prosty sposób przedstawić je jako tablice i zapisać w postaci skompresowanej w HDF5. Ta biblioteka jest wyposażona w niektóre algorytmy szybkiej kompresji, dzięki czemu odczytywanie i zapisywanie skompresowanych danych może być nawet szybsze niż nieskompresowane.
Oto kilka wątków:
Czas sekwencyjnego dostępu do elementu dla tablicy 15 GB i różnych wielkości porcji:
Szybkość dekompresji za pomocą Blosc na PyTables:
A jeśli są ograniczone długością, można je przechowywać w tabeli, a tym samym prawdopodobnie zyskać nieco więcej miejsca. A podczas pobierania ich z pamięci masz je już w bardzo dogodnej formie, aby zastosować swój algorytm.
źródło