Einzelnen Beitrag anzeigen

Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#8

Re: Problem mit der Sortierung im VST

  Alt 28. Mär 2009, 13:16
Hi,

mal als Nachtrag für die, die es interessiert: Ich habe das "Problem" gelöst. Da war einfach eine viel zu komplizierte Logik im ursprünglichen Ansatz.

Anforderung
Die Anforderung ist eine Sortierung entweder von 1..n oder n..1, die der Benutzer durch Klick auf den Columnheader der ersten Spalte auswählen kann. Die interne Sortierung im VST mit Hilfe von OnCompareNode ist sehr schnell, aber erreicht bei großen Datenmengen schnell ein Performancelimit. Große Datenmengen sind hier DB-gestützte Trees mit 2,5 - 5 Mio Nodes.

Lösung
Da die Werte alle linear sind, braucht man kein Quicksort o.ä., sondern nur eine Neuzuweisung der vorhandenen Zeilennummern. Es wird also statt zu sortieren einfach die hinterlegte Indexnummer geändert bzw. umgekehrt.

Das einzige Problem war die Benutzerauswahl, also die selektierten Nodes. Hier hatte ich verschiedene Ansätze mit Hilfe von Integer-Arrays und Nodelisten getestet. Es stellte sich jedoch heraus, daß diese viel zu langsam sind (wegen des nötigen Vergleichs ob ein Element im Array ist).

Dieses zweite Problem konnte ich lösen, in dem ich die Nodeauswahl mit Hilfe einer Swap Funktion umkehre (also erstes und letzes Element, dann 2. und vorletztes, ... bis zur Hälfte des Trees). Natürlich nur, falls der Auswahlstatus vsSelected bei den Nodes unterschiedlich ist.

Das Hinzufügen der Nodes erfolgt nun im Betrieb per RootNodeCount wenn die Sortierung sdAscending ist und per InsertNode mit amInsertBefore, wenn ein Node vor dem ersten Eintrag benötigt wird (Sortierung sdDescending). Damit die Indexnummer wieder stimmt, wird der Node hier Reinitialisiert und der korrekte Wert zugewiesen.

Zeiten
Ursprüngliche Zeiten:
~3500ms - Sortierung von 2,5 Mio Nodes mit dem VST AutoSort / OnCompareNode
~3500ms - Hinzufügen von 10 Nodes zu dem 2,5 Mio Nodes - Tree (bei genutztem VST AutoSort)

Meine Zeiten:
~94ms - "Sortierung" von 2,5 Mio Nodes (Selection wird dabei auch angepasst und bleibt erhalten)
~0-100ms - Hinzufügen von 10 Nodes zu den 2,5 Mio Nodes (korrekte Nummerierung, davor oder dahinter eingefügt)

Das ganze auf einem langsamen T7xxx Laptop getestet. Selbst bei 25 Mio Nodes sind die Zeiten ok (~ 1,5 Sek).

Also, geht doch

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat