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..3of 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..3of Integer;
    usedarr: array[0..MaxRandom - 1of 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.
user profile iconBenBE hat folgendes geschrieben:
Bei Dir geht es drum 80 zufällige Zahlen zu ermitteln, die keine Dopplungen enthalten?

Richtig.
user profile iconBenBE 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..3of Integer;
    usedarr: array[0..MaxRandom - 1of 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.