Der Code aus der Hilfe funktioniert dafür auch. Also gut, dass du es damit gelöst hast
Ich bin so frech und nutz die Gelegenheit noch für eine kleine Programmierlektion:
Der Nachteil vom Code aus der Hilfe: Er läuft mit O(n²). Was das nun heißt? Nun ja, er schaut sich für jedes Element jedes andere Element an. Die Anzahl der Elemente mit n bezeichnet.
Hier der relevante Ausschnitt:
Code: Alles auswählen
ForEach Numbers()
Value = Numbers()
PushListPosition(Numbers())
While NextElement(Numbers())
If Numbers() = Value
DeleteElement(Numbers())
EndIf
Wend
PopListPosition(Numbers())
Next
Also du hast die äußere Schleife für jedes Listenelement und die innere für jedes Listenelement ab dem aktuellen. Das ist dann genau genommen n*(n-1)/2 = n²/2-n/2, aber man vereinfacht es in O(n^2), weil man bei der so genannten O-notation nur den am stärksten skalierenden Term, den quadratischen betrachtet.
Was bedeutet das für den Code? Nun wenn du eine Liste mit 10.000 Elementen hineinfütterst muss er grob 10.000² also ca 100.000.000 Operationen ausführen, das dauert!
(Genau genommen sind es 49.995.000, Löschung mal nicht betrachtet)
Die Lösung die ich vorgeschlagen habe hätte z.B. 2 Schleifen über die Liste, aber nicht verschachtelt. Genau genommen sind das 2n Operationen weil zwei Schleifen macht im Beispiel 20.000, oder auch 0,04% der Operationen die man für die verschachtelten Schleifen nutzt. In O Notation ist das O(n), weil man auch Faktoren wie die 2 fallen lässt, für 10.000 Elemente brauchst du also nur ca 10.000 Operationen.
Du merkst, mit der O-Notation kannst du schnell abschätzen, wie effizient ein Algorithmus mit großen Eingabedaten umgeht. Unabhängig davon, wie er dann konkret implementiert wird.
Moderne CPUs sind so flott, da merkst du bei deiner Liste den Unterschied nicht, wenn du nicht gerade zehntausende Dateien hast. Aber bei anderen Dingen kann es sehr nützlich sein, über die Laufzeit des Codes nachzudenken.