Wie "sortiere" ich am schnellsten?

LL0rd

Erfahrenes Mitglied
Hallo Leute,

ich habe gerade ein kleines Problem und brauche einen Rat. Ich habe eine Liste mit Objekten (n > 100.000), jedes Objekt hat dabei eine Eigenschaft, die die Qualität dieses Objektes beschreit (double).

Das Programm ist ein Produktionsnetz. Es holt sich die besten 64 Objekte aus der Liste raus, produziert daraus neue Objekte und wirft diese dann in die Liste.

Das Herausholen der 64 besten Objekte habe ich derzeit mit dem Sortieren der Liste realisiert. Doch das Sortieren dauert natürlich. Das würde ich jetzt gerne wegoptimieren.

Nun da habe ich mir jetzt verschiedene Möglichkeiten ausgedacht.
Möglichkeit Nr. 1: Ich tendiere momentan dazu, statt einer Liste einnen B-Baum zu verwenden. Dort könnte ich dann recht schnell die passenden Objekte raussuchen.

Möglichkeit Nr. 2: Da ich keine ganze Sortierte Liste brauche, könnte ich aus der Hauptliste die ersten 64 Objekte in eine neue (vll. verkettete) Liste übernehmen. Dann gehe ich zum 65 Objekt der großen Liste und schau mir an, ob die Qualität besser ist, als die des schlechtesten Elementes der neuen Liste. Ist es das, dann schmeiße ich raus und nehme stattdessen das neue mit rein. So wiederhole ich den Vorgang, bis ich eine einigermaßen gute Qualität habe.

Möglichkeit Nr. 3: Ich sortiere meine Liste, während die Berechnung läuft in einem eigenen Thread. Wenn ich dann die Ergebnisse der Berechnungen vorliegen habe, werfe ich diese einfach in die große Liste rein. Ich habe dann vll. nicht die besten 64 Objekte erwischt, habe aber noch eine einigermaßen gute Qualität der Daten

Das ist jetzt as Effektivste, woran ich gedacht habe. Was haltet Ihr davon?
 
Hallo LL0rd,

werden die 64 besten Objekte aus der Liste entfernt oder sollen diese drin bleiben? Baut sich die Liste im Programmverlauf auf oder hast du die 100.000 Objekte gleich am Anfang? Je nach Antwort auf diese Fragen könntest du z.B. einen Heap (nur für die besten 64 Objekte oder für alle) verwenden und/oder dir die besten 64 Objekte über Quickselect holen.

Grüße, Matthias
 

Neue Beiträge

Zurück