Entwickler-Ecke
Algorithmen, Optimierung und Assembler - [Optimierung] Array oder doch lieber einzelne Variablen
Regan - So 16.09.07 14:17
Titel: [Optimierung] Array oder doch lieber einzelne Variablen
Hy,
ich habe ein Problem mit meinem Quellcode. Ich weiß nicht, was schneller ist- Ich gebe mal ein Beispiel(mit deutlich weniger Variablen als ich habe; bei mir sind es ca. 80):
Mit Variablen
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| procedure Tjaja.jaja(); var a,ab,abc,abcd:Integer; tempboolean:Boolean; begin a:=random(50);
repeat tempboolean:=false; ab:=random(50); if ab<>a then tempboolean:=true; until tempboolean;
repeat tempboolean:=false; abc:=random(50); if abc<>a then if abc<>ab then tempboolean:=true; until tempboolean;
repeat tempboolean:=false; abcd:=random(50); if abcd<>a then if abcd<>ab then if abcd<>abc then tempboolean:=true; until tempboolean; end; |
Oder sollte ich es lieber mit dieser Variante probieren:
Array
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure Tjaja.jaja(); var myarray:Tarray[0..3] of Integer; i, o:Integer; tempboolean:Boolean; begin For i:=0 to 3 do begin myarray[i]:=random(50); if i=0 then continue; tempboolean:=true; repeat For o:=i-1 downto 0 do begin if myarray[o]=myarray[i] then tempboolean:=false; end; until tempboolean; end; end; |
Mir gefällt die zweite Variante irgendwie vom schreiben her besser, aber ich weiß nicht, ob sie auch schneller ist. Vielleicht kann mir jemand helfen. Danke im Vorraus.
MfG
Regan
BenBE - So 16.09.07 14:27
Bei Dir geht es drum 80 zufällige Zahlen zu ermitteln, die keine Dopplungen enthalten?
In dem Fall ist rein von der Wartung die zweite Variante besser. Außerdem lässt sich mit einem Array sogar noch eine weitere Optimierung einbauen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure Tjaja.jaja(); const MaxRandom = 50; var myarray: array[0..3] of Integer; usedarr: array[0..MaxRandom - 1] of boolean; i:Integer; begin FillChar(UsedArr[0], SizeOf(UsedArr), #0);
For i:=0 to 3 do begin Repeat myarray[i]:=random(MaxRandom); Until not UsedArr[MyArr[i]]; UsedArr[MyArr[i]] := True; end; end; |
Regan - So 16.09.07 14:33
Vielen Dank für die schnelle Anwort.
BenBE hat folgendes geschrieben: |
| Bei Dir geht es drum 80 zufällige Zahlen zu ermitteln, die keine Dopplungen enthalten? |
Richtig.
BenBE hat folgendes geschrieben: |
In dem Fall ist rein von der Wartung die zweite Variante besser. Außerdem lässt sich mit einem Array sogar noch eine weitere Optimierung einbauen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure Tjaja.jaja(); const MaxRandom = 50; var myarray: array[0..3] of Integer; usedarr: array[0..MaxRandom - 1] of boolean; i:Integer; begin FillChar(UsedArr[0], SizeOf(UsedArr), #0);
For i:=0 to 3 do begin Repeat myarray[i]:=random(MaxRandom); Until not UsedArr[MyArr[i]]; UsedArr[MyArr[i]] := True; end; end; | |
Könntest du vielleicht mir erklären, was in den einzelnen Schritten passiert (Kommentare reichen zu )?
BenBE - So 16.09.07 14:37
Naja: ganz einfach:
In der Repeat-Schleife wird in jedem Durchlauf eine Zufallszahl ermittelt und geprüft, ob wir diese schon hatten.
Wenn nicht, wir nach der Schleife markiert, dass wir diese bereits hatten (nämlich jetzt grad ;-)).
Übrigens kann man in begrenzten Zahlenbereichen auf diese Weise recht schnell (nämlich linear) sortieren ;-)
Ach ja: Zeile 9 initialisiert nur das Array auf alles False ...
Regan - So 16.09.07 14:39
Ja. Das klingt verständlich. Vielen Dank nochmals.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!