1

Was ist der beste Weg, um mehrdimensionale Daten in C++ zu speichern? Ich suche nach einer dynamischen Datenstruktur statt nach statischen mehrdimensionalen Arrays, da die Anzahl der Elemente, die in der Struktur gespeichert werden sollen, nicht vorher festgelegt werden kann.Speicher und Verarbeitung effiziente mehrdimensionale Datenstruktur C++

Darüber hinaus bin ich auf der Suche nach einer Datenstruktur, die die Speicherkosten minimieren und eine schnellere Suche ermöglichen. Gibt es eine fertige Datenstruktur oder muss ich eine mehrdimensionale baumbasierte Datenstruktur implementieren?

Edit: Ich muss mehrdimensionale Stream-Daten in einigen Datenstruktur speichern. Der Datenstrom hat zB die Form: (Schlüssel1, Schlüssel2, Schlüssel3, Wert1), (Schlüssel1, Schlüssel2, Schlüssel3, Wert2), (Schlüssel1, Schlüssel2, Schlüssel3, Wert3), ...

Später würde ich mag die Daten in Bezug auf verschiedene Schlüssel suchen.

+8

Schnell für welche Operationen? Einfügen, Löschen, Suchen? – CoryKramer

+5

Holen Sie vier Personen in den gleichen Raum und Sie erhalten fünf Definitionen, was "am besten" bedeutet. –

+0

"Es gibt entweder zu viele mögliche Antworten, oder gute Antworten wären zu lang für dieses Format. Bitte fügen Sie Details hinzu, um die Antwortgruppe einzuschränken oder ein Problem zu isolieren, das in einigen Absätzen beantwortet werden kann." Und ich wählte diese Flagge charitativ statt hauptsächlich auf der Meinung basiert. –

Antwort

1

Ich muss mehrdimensionale Stream-Daten in einigen Datenstruktur speichern. ZB hat der Datenstrom das folgende Format: (Schlüssel1, Schlüssel2, Schlüssel3, Wert), (Schlüssel1, Schlüssel2, Schlüssel3, Wert), (Schlüssel1, Schlüssel2, Schlüssel3, Wert), ...

Später würde ich mag die Daten in Bezug auf verschiedene Schlüssel suchen.

boost::multiindex ermöglicht das Hinzufügen verschiedener Arten von Indizes zu Ihrem Container.

Es ist eine ziemlich komplexe Bibliothek und kann ein bisschen schmerzhaft sein, sich daran zu gewöhnen. Aber das ist die Mühe wert, weil das Problem, das es löst, ein ziemlich allgemeines ist.

+0

Nach dem Studium des boost :: multiindex scheint es, dass alle Attribute eines Elements/einer Struktur indiziert werden müssen, wenn boost :: multiindex verwendet wird. – shaikh

1

Wenn die schnelle Suche und Speichereffizienz die einzigen Dinge sind, die Sie benötigen, sollten Sie eine Hashtabelle verwenden (z. B. die STL-Datei: std::unordered_set<std::vector<int>>).

Dies ermöglicht Ihnen Insertionen, Löschungen und Nachschlagen in bis zu amortisierten O(1) Zeit unter Verbrauch von O(n) Speicher.

Um std::unordered_set zu verwenden, sollten wir eine Hash-Funktion bereitstellen, und std::hash<std::vector<T>> ist nicht definiert. Das Beispiel der Verwendung dieses Ansatzes (einschließlich einiger nicht schrecklicher Hash-Funktion) kann here gefunden werden.

@BiagioFesta Wie erwähnt, zeigt diese Code Zeitkomplexität von O(D) wo D eine Anzahl der Dimensionen ist, da jede Operation Hash-Berechnung wird, die O(D) Zeit in Anspruch nimmt. Dies kann durch Speichern von Hash innerhalb des Elements beschleunigt werden.

+0

Wie es multi-dimensional ist? – shaikh

+0

@shaikh Aktualisiert eine Antwort. Es erlaubt Ihnen, 'std :: vector ' zu setzen und zu finden, die mehrdimensionale Daten darstellen können. Aus der Frage, welche Operationen Sie benötigen, ist leider nicht ganz klar. – alexeykuzmin0

+1

O (1)? Ich denke nicht. Die Hash-Funktion ist O (N), mit der Größe N des Vektors. Jede Operation wird sich mit der Hash-Funktion beschäftigen, also ist die Komplexität im strengen Sinne keine Konstante (da "Ich suche nach einer dynamischen Datenstruktur statt nach statischen mehrdimensionalen Arrays, wie die Anzahl der Elemente, die in der Struktur kann nicht vorherbestimmt werden. * "-von Frage) –