Re: Schnellster Weg eine Liste zufällig zu sortieren?
Verfasst: 23.02.2011 21:21
Über wie viel Millionen Einträge reden wir eigentlich?
Gruß Christian
Gruß Christian
Das deutsche PureBasic-Forum
https://www.purebasic.fr/german/
Code: Alles auswählen
#Max = 50
Define n
Dim Element(#Max)
For n = 0 To #Max
Element(n) = n
Next
OpenConsole()
For n = 0 To #Max
Swap Element(n),Element(Random(#Max))
Next
; ausgabe
For n = 0 To #Max
PrintN( Str(Element(n)))
Next
PrintN("Press any key to exit"): Repeat: Until Inkey() <> ""
Code: Alles auswählen
Define count.i = 20
Dim arr.i(count)
Define i.i, j.i, k.i
;Wie oft steht an Position i die Zahl j
Dim h.i(count, count)
For k = 1 To 100000
;Array füllen
For i = 0 To count - 1
arr(i) = i
Next
; ;Array mischen
For i = count - 1 To 0 Step -1
Swap arr(i), arr(Random(i))
Next
; For i = 0 To count - 1
; Swap arr(Random(count - 1)), arr(Random(count - 1))
; Next
;Array ausgeben
For i = 0 To count - 1
;Debug arr(i)
h(i, arr(i)) + 1
Next
Next
For i = 0 To count - 1
s.s = ""
For j = 0 To count - 1
s + RSet(Str(h(i, j)), 5, "0") + " | "
Next
Debug s
Next
Code: Alles auswählen
If SortStyle = 3
NewList ListCopy$()
CopyList(SourceFileContentList$(),ListCopy$())
ClearList(SourceFileContentList$())
For x.l = ListSize(ListCopy$())-1 To 0 Step -1
AddElement(SourceFileContentList$())
SelectElement(ListCopy$(),Random(x))
SourceFileContentList$() = ListCopy$()
DeleteElement(ListCopy$())
Next
EndIf
Code: Alles auswählen
If SortStyle = 2
SizeSourceFileContentList = ArraySize(SourceFileContentArray$())
For x.l = 0 To SizeSourceFileContentList-1
rand.l = Random(SizeSourceFileContentList-1)
Swap SourceFileContentArray$(x),SourceFileContentArray$(rand)
Next
EndIf
Code: Alles auswählen
AllStat.TimerLog = empty.TimerLog
Code: Alles auswählen
Define count = 10
NewList a()
For i = 0 To count-1
AddElement(a())
a() = i+1
Next i
If FirstElement(a())
While NextElement(a()) ; Schleife geht mit 2. Element los
*a = @a()
SelectElement(a(), Random(ListIndex(a())))
*b = @a()
If *a <> *b
SwapElements(a(), *a, *b)
ChangeCurrentElement(a(), *b) ; neues Ende des bearbeiteten Teils
EndIf
Wend
EndIf
ForEach a()
Debug a()
Next a()
Code: Alles auswählen
Define count.i = 20
Dim arr.i(count)
Define i.i, j.i, k.i
; Summiert die Zahlen verschiedener Versuche einfach in dieses Array
Dim h.i(count)
For k = 1 To 100000
;Array füllen
For i = 0 To count - 1
arr(i) = i
Next
; ;Array mischen
For i = count - 1 To 0 Step -1
Swap arr(i), arr(Random(i))
Next
For i = 0 To count - 1
;Debug arr(i)
h(i) + arr(i)
Next
Next
;Array ausgeben
For i = 0 To count - 1
s.s = ""
s + RSet(Str(h(i)), 10, "0") + " | "
Debug s
Next
Code: Alles auswählen
Define count = 100000
NewList a()
StartTime.l = ElapsedMilliseconds()
Dim *pointerarray(0)
For i = 0 To count-1
ReDim *pointerarray(i)
*pointerarray(i) = AddElement(a())
a() = i+1
Next i
For x.l = count - 1 To 1 Step -1
SwapElements(a(), *pointerarray(x), *pointerarray(Random(x-1)))
Next
; ForEach a()
; Debug a()
; Next a()
Debug Str(ElapsedMilliseconds() - StartTime) + "ms"
Da liegt der Denkfehler. Egal wie viele Elemente noch da sind, die Wahrscheinlichkeit ein spezielles davon zu nehmen ist für alle noch vorhandenen Elemente gleich. Die Chance steigt zwar die 3 zu tauschen (wenn sie noch nicht gewählt wurde), aber genauso steigt auch die Chance für die 19 falls sie noch vorhanden ist.SebastianJu2 hat geschrieben:Denn wenn man hinten anfängt zu tauschen ist die Tauschmasse mit der man tauscht 19 Elemente groß. Die Chance dass ein Element, also zB die 5 gewählt wird ist gering. Wenn das weiter voran geht dann sind nur noch 5 Elemente zum Tausch da. Die Chance steigt zB die 3 zu tauschen.
Aber das mit der gleichen Chance würde das nicht nur gelten wenn man das Array durchgeht und dabei das jeweilige Element mit allen anderen Arrayelementen tauschen könnte? Also nach nach hinten? Ansonsten... wenn man zB von Position 19 zu 0 vorgeht und das jeweilige Element immer nur nach unten tauschen läßt, also an Position 12 kann die Position 12 nur mit Position 0-11 getauscht werden dann sollte das Topf-Prinzip doch nicht mehr gelten oder?Da liegt der Denkfehler. Egal wie viele Elemente noch da sind, die Wahrscheinlichkeit ein spezielles davon zu nehmen ist für alle noch vorhandenen Elemente gleich. Die Chance steigt zwar die 3 zu tauschen (wenn sie noch nicht gewählt wurde), aber genauso steigt auch die Chance für die 19 falls sie noch vorhanden ist.