Wie greifst du auf die Datenstruktur zu, über einen Index oder brauchst du nur das erste/letzte Element?
Ich muss Elemente gar nicht abfragen, da sie abgesehen vom Schlüssel keine Daten enthalten. Ich muss nach .add(a) und .add(b) nur feststellen können, dass a vor b eingefügt wurde.
Zitat
wenn du bei einem std::vector immer nur am Anfang oder am Ende einfügst, hättest du eine implizite Ordnung, über die Element-Speicheradresse könntest du damit für zwei Elemente auch die Reihenfolge auswerten.
Richtig. Das ist meine Variante I. Das Löschen braucht dann allerdings lineare Zeit. Und auch das Feststellen ob a oder b zuerst eingefügt wurde (sofern beide überhaupt enthalten sind) braucht lineare Zeit, da ich a und b zuerst einmal finden muss bevor ich die Adressen vergleichen kann.
- Was bedeutet "feststellen, welches von 2 Elementen zuerst eingefügt wurde"? 2 beliebige Elemente nach einem Schlüssel suchen und deren Einfügezeit vergleichen?
Genau.
Zitat
- Wie viele Elemente sind denn so durchschnittlich in der Datenstruktur?
Das kann stark unterschiedlich sein, aber einige k bis 10k können es schon sein.
Zitat
- So effizient wie möglich? Wie wäre es dann mit etwas selbst implementiertem und auf das Wesentliche reduzierte? Etwas vorgefertigtes ist halt meist etwas allgemein gehalten. Oder geht es nur um die Laufzeitkomplexität?
Ich meinte in Bezug auf die Komplexität.
Zitat
Eine Hashtabelle. Einfügen konstant, löschen konstant, 2*suchen und vergleichen ebenfalls konstant. Zahlt sich auch erst ab vielen Elementen aus.
Ein Einfügeindex ist hier auch nötig.
Von der Hashtabelle alleine kann ich noch nicht ableiten was zuerst drin war. Nachdem die Schlüssel keine Daten anhängen haben, geht es genau genommen nur um den Einfügeindex.
Zitat
Einfügeindex: Wie weit liegen minimaler und maximaler Index maximal auseinander (< MAX_INT)? Weiß man wo ungefähr der minimale Index liegt, kann man diesen von beiden Indizes abziehen und erst danach vergleichen. Dann sind beide immer positiv und der Vergleich immer korrekt, selbst wenn man immer hinaufzählt.
Das verstehe ich jetzt nicht ganz.
Meine Idee war diese: Bei jedem add(e) wird dem e der aktuelle Zähler zugewiesen und dieser anschließend erhöht. Wenn ich wissen will ob a vor b eingefügt wurde, dann muss ich nur die beiden Zähler vergleichen. Das funktioniert selbst dann wenn zwischendurch Elemente (samt ihrem Zähler) wieder gelöscht wurden. Problem ist halt dass ich einen Index niemals wiederverwenden darf weil sonst die Ordnung zerstört wird.