Hier ist mein Problem, ich brauche eine Datenstruktur, die sich wie ein queue
verhält, aber einige andere Eigenschaften hat:
tag
einfach zu löschen (jedes Element in dieser Warteschlange hat ein tag
, das sie gruppiert) key
zu löschen (alle Gegenstände, die der Sammlung hinzugefügt werden, haben einen solchen eindeutigen Schlüssel). Hier, wenn es Dinge vereinfacht, könnte ich per tag
und key
entfernen, wenn es schneller wäre. Ich verwende C #, um diese Lösung zu erstellen, aber ich wäre viel mehr an Definitionen von Algorithmen und Datenstrukturen interessiert, da ich kaum glaube, dass eine der verfügbaren Sammlungen meine Anforderungen erfüllt.
Papers, Bücher, Blog-Posts und jede andere Art von Hinweis darauf sind wirklich willkommen.
Klingt so, als ob Sie eine simultan verknüpfte Liste für den Warteschlangenteil verwenden können. Für den delete-by-key-Teil könnten Sie eine gleichzeitige Hash-Tabelle behalten (Stripeset-Locks sind leicht zu machen), die auf Knoten in der Warteschlange zeigt.
Wenn dieser Ansatz fehlschlägt, sehen Sie sich an, wie Datenbanksysteme dies tun. Sie können alles gleichzeitig tun, was Sie wollen. Sie pflegen eine Primärkopie der Daten in einem B-Baum und behalten sekundäre B-Baum-Indizes bei. Zum Sperren verwenden sie eine gleichzeitige Hash-Tabelle. B-Bäume haben gute Nebenläufigkeitseigenschaften, weil Sie die oberen Teile von ihnen leicht teilen können, selbst wenn Sie die Blätter unter einer exklusiven Sperre aktualisieren.
Ich denke, Sie können doppelt doppelt verknüpfte Listen und zwei Hashtabellen verwenden.
Beispiele in Python (Es tut mir leid ...)
Einfügen eines Elements:
%Vor%Entfernen eines Elements nach Schlüssel:
%Vor%Entfernen eines Elements nach Tag:
%Vor%So ähnlich. Hoffe es hilft.
Tags und Links algorithm language-agnostic c# concurrency data-structures