Ich suche nach einem Online-Algorithmus, der einen Strom von Elementen aufnimmt und die Elemente an der Pareto-Grenze beibehält (z. B. alle nicht dominierten Elemente).
Zum Beispiel. Angesichts der folgenden Eingaben würde sich der beibehaltene Pareto-Grenzsatz wie folgt entwickeln:
(3,7)
- Element einfügen b / c es ist das erste Element
- Pareto-Set enthält jetzt
{(3,7)}
(7,3)
- Element einfügen b / c es wird im ersten nicht dominiert
- Pareto-Set enthält jetzt
{(3,7), (7,3)}
(8,4)
- Element einfügen b / c es ist nicht dominiert; entfernen,
(7,3)
was es in beiden Dimensionen dominiert - Pareto-Set enthält jetzt
{(3,7), (8,4)}
- Element einfügen b / c es ist nicht dominiert; entfernen,
(1,1)
- Nicht einfügen, da es in beiden Dimensionen dominiert
- Pareto-Set enthält jetzt
{(3,7), (8,4)}
(9,9)
- Element einfügen b / c es ist nicht dominiert; Entfernen Sie alle anderen Elemente, da diese in beiden Dimensionen dominieren
- Pareto-Set enthält jetzt
{(9,9)}
In meinem Beispiel verwende ich 2-Tupel, suche aber nach einem Algorithmus, der N-Tupel für "kleine" N verarbeiten kann (z. B. <10).
Die naive Lösung besteht darin, jedes Element mit allen Elementen zu vergleichen, die sich derzeit in der Menge befinden. In der Praxis ist der naive Ansatz möglicherweise nicht so schlecht (z. B. sub) weil Elemente regelmäßig vom Vergleichssatz ausgeschlossen werden. Aber ich habe mich gefragt, ob es dafür einen bekannten effizienten Algorithmus gibt. Ich interessiere mich für Effizienz im Speicher und für Rechenkomplexität. (Ha! Und tatsächlich suche ich nach einer Reihe von Algorithmen, die hinsichtlich Speicher und Rechenkomplexität paretooptimal sind.)
Meine derzeitige Anwendung besteht darin, ein Lucene - Suchdokument zu erstellen Collector
, das nicht die relevantesten Dokumente sammelt (der typische Anwendungsfall für eine Suchmaschine), sondern die Pareto-optimalen Dokumente entlang bestimmter Dimensionen sammelt.