Welche Datenstruktur würde ganzzahlige Bereiche effizient speichern?

10

Ich muss eine Sammlung von Ganzzahlen im Bereich von 0 bis 65535 führen, damit ich schnell Folgendes tun kann:

  • Fügen Sie eine neue Ganzzahl ein
  • Fügen Sie eine Reihe zusammenhängender Ganzzahlen ein
  • Entfernen Sie eine Ganzzahl
  • Entfernen Sie alle Ganzzahlen unter einer Ganzzahl
  • Testen Sie, ob eine Ganzzahl vorhanden ist

Meine Daten haben die Eigenschaft, dass sie häufig Ganzzahlen in der Sammlung enthalten. Zum Beispiel könnte die Sammlung zu einem bestimmten Zeitpunkt sein:

{ 121, 122, 123, 124, 3201, 3202, 5897, 8912, 8913, 8914, 18823, 18824, 40891 }

Der einfachste Ansatz besteht darin, nur einen ausgeglichenen Binärbaum wie den C ++ std :: set zu verwenden. Dabei nutze ich jedoch nicht die Tatsache, dass ich häufig Zahlenläufe habe. Vielleicht wäre es besser, eine Sammlung von Sortimenten aufzubewahren? Dies bedeutet jedoch, dass ein Bereich aufgelöst werden kann, wenn eine Ganzzahl in seiner Mitte entfernt wird, oder zusammengefügt werden muss, wenn der Abstand zwischen zwei Bereichen ausgefüllt wird.

Gibt es vorhandene Datenstrukturen, die für dieses Problem gut geeignet wären?

WilliamKF
quelle

Antworten:

9

Ich schlage vor, Sie verwenden einen binären Suchbaum, der so erweitert ist, dass Blätter ein Intervall enthalten können (eine Folge aufeinanderfolgender Ganzzahlen). Behalten Sie die Invariante bei, dass sich die Intervalle nicht überlappen und in Ordnung sind (nach der Invariante des Suchbaums). (Dies kann als Sonderfall eines Intervallbaums oder eines Segmentbaums betrachtet werden, für den Sonderfall, in dem sich die Intervalle nicht überlappen.)

O(lgn)nn65535O(lgn)

DW
quelle
5

Erstens ist Ihre Frage sehr schlecht formuliert, wenn auch aus keinem anderen Grund, weil "schnell" nicht viel bedeutet. Sie müssen eine Metrik angeben, was "schnell" bedeutet.

Wenn Sie versuchen, ein Design für ein Problem zu entwickeln, müssen Sie das Problem zunächst sehr gut verstehen und viele zusätzliche Fragen stellen. Relevante Fragen in diesem Fall scheinen zu sein (in keiner bestimmten Reihenfolge):

  • Müssen alle diese Vorgänge gleich schnell sein oder sind einige wichtiger als andere?
  • Gibt es noch andere Überlegungen?
  • Ist das Gedächtnis überhaupt ein Problem?
  • Ist die Möglichkeit, Einfügungen, Entfernungen und Suchvorgänge von mehreren Threads durchzuführen, ein Problem?
  • Konzentriert sich die Arbeitsbelastung hauptsächlich auf das Einfügen? Entfernen? Hoch schauen?

[0,65535]

Für ein bisschen mehr Arbeit könnten Sie auf Kosten der Geschwindigkeit Platz sparen, wenn dies ein Problem darstellt, indem Sie die Daten als Bits in 8192 Ganzzahlen speichern. Obwohl die einzelnen Ganzzahloperationen konzeptionell immer noch eine konstante Zeit und die Ganzzahloperationen im Bereich immer noch eine lineare Zeit wären, wären sie langsamer.

Wenn dies wirklich Ihr Problem ist, würde ich sagen, verwenden Sie ein Array und fahren Sie mit anderen, wichtigeren Dingen mit dem Code fort.

[0,65535]

Nik Bougalis
quelle
3

U={0,,u1}O(loglogu)

Abhängig von der Struktur Ihrer Daten gibt es möglicherweise viele clevere Alternativen zum Speichern Ihrer Daten.

A.Schulz
quelle