Re: NewList
Verfasst: 06.05.2013 23:29
Hast du den Zusatz-String oben nur aus Versehen mit einem extra Leerzeichen vor dem Unterstrich versehen oder war das extra?
Jedenfalls ist das Hauptproblem das 'SelectElement()'. Das arbeitet bei Listen nämlich nicht sonderlich effektiv und sollte bei Listen-Operationen vermieden werden. Wenn man per Index auf etwas zugreifen will, nutzt man Arrays.
Außerdem ist es nicht notwendig in jedem Schleifendurchlauf einmal vorwärts und wieder zurück zu gehen. Eigentlich muss man sich nur den Pointer zum ersten Element merken und dann ab dem zweiten anfangen über die Liste zu iterieren, das aktuelle Element mit dem 'gemerkten Element' vergleichen und dann den Pointer auf das jetzt aktuelle Element setzen, damit im nächsten Schleifendurchlauf damit verglichen wird.
Das ganze sieht dann so aus und dauert bei mir gerade mal 71 ms.
Bei Fragen fragen!
Nachtrag:
Natürlich gehört das Sortieren der Liste normalerweise zur Zeitmessung dazu und sollte deswegen auch berücksichtigt werden. Und um das ganze auch mit praktischen Werten vergleichen zu können, sollte man die Liste zu Anfang auch randomisieren.
Dann dauert es mit folgendem Testcode bei mir 1500 ms:
Jedenfalls ist das Hauptproblem das 'SelectElement()'. Das arbeitet bei Listen nämlich nicht sonderlich effektiv und sollte bei Listen-Operationen vermieden werden. Wenn man per Index auf etwas zugreifen will, nutzt man Arrays.
Außerdem ist es nicht notwendig in jedem Schleifendurchlauf einmal vorwärts und wieder zurück zu gehen. Eigentlich muss man sich nur den Pointer zum ersten Element merken und dann ab dem zweiten anfangen über die Liste zu iterieren, das aktuelle Element mit dem 'gemerkten Element' vergleichen und dann den Pointer auf das jetzt aktuelle Element setzen, damit im nächsten Schleifendurchlauf damit verglichen wird.
Das ganze sieht dann so aus und dauert bei mir gerade mal 71 ms.
Code: Alles auswählen
NewList File1.s()
Define i.i
For i = 0 To 1000000
If AddElement(File1())
File1() = "Dies ist ein Teststring_" + Str(i)
EndIf
Next
If AddElement(File1())
File1() = "Dies ist ein Teststring_" + Str(1000000)
EndIf
SortList(File1(), #PB_Sort_Ascending)
Define Time.i = ElapsedMilliseconds()
;---------------------------------------------------------
If FirstElement(File1())
Define *File1Last.String = @File1()
While NextElement(File1())
If *File1Last\s = File1()
j + 1
EndIf
*File1Last.String = @File1()
Wend
EndIf
;---------------------------------------------------------
Time = ElapsedMilliseconds() - Time
MessageRequester("Info", "Zeit: " + Str(Time) + #CRLF$ + "Doppelt: " + Str(j))
Nachtrag:
Natürlich gehört das Sortieren der Liste normalerweise zur Zeitmessung dazu und sollte deswegen auch berücksichtigt werden. Und um das ganze auch mit praktischen Werten vergleichen zu können, sollte man die Liste zu Anfang auch randomisieren.
Dann dauert es mit folgendem Testcode bei mir 1500 ms:
Code: Alles auswählen
NewList File1.s()
RandomSeed(0) ;Selber Randomseed, damit immer die selben Ergebnisse kommen
Define i.i
For i = 0 To 1000000
If AddElement(File1())
File1() = "Dies ist ein Teststring_" + Str(Random(1000000))
EndIf
Next
Define Time.i = ElapsedMilliseconds()
SortList(File1(), #PB_Sort_Ascending)
;---------------------------------------------------------
If FirstElement(File1())
Define *File1Last.String = @File1()
While NextElement(File1())
If *File1Last\s = File1()
j + 1
EndIf
*File1Last.String = @File1()
Wend
EndIf
;---------------------------------------------------------
Time = ElapsedMilliseconds() - Time
MessageRequester("Info", "Zeit: " + Str(Time) + #CRLF$ + "Doppelt: " + Str(j))