Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

31

03.01.2012, 18:16

Und das umstellen auf Bytes wird Geschwindigkeitstechnisch nichts bringen.

Wie gesagt: Informiere dich genau über die Laufzeiten der von dir benutzen Funktionen. Dass es mit LinkedLists so viel langsamer ist, ist sehr merkwürdig, dann musst du irgendwo wieder etwas benutzen, was eben auf LinkedLists sehr langsam ist.
Lieber dumm fragen, als dumm bleiben!

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

32

03.01.2012, 18:17

Vor allem wurde grad genannt, warum die LinkedList dir den Geschwindigkeitsvorteil geben wird. Und klar hast du es damit schon getestet, wie du bereits zwei mal geschrieben hast, du hast jedoch auch geschrieben, dass sich dein Code verändert hat. Dann guck noch mal was sich genau verändert hat und was die LinkedList schneller macht als die ArrayList. Wurde ja grad schon geschrieben. Dann überdenk das noch mal. Und danach solltest du vielleicht den Ansatz überdenken. Das Problem sollte lösbar sein, ohne alle Möglichkeiten zu speichern.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Affje

Treue Seele

  • »Affje« ist der Autor dieses Themas

Beiträge: 89

Beruf: Student

  • Private Nachricht senden

33

03.01.2012, 18:23

Das Problem sollte lösbar sein, ohne alle Möglichkeiten zu speichern.

Für den Algorithmus braucht man zumindest anfangs alle möglichen Kombinationen, da kommt man nicht drum rum. Wie man diese erstellt und wie effizient man diese speichert und vergleicht, mag in einem anderen Buch stehen.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

34

03.01.2012, 18:34

Ich wollte damit sagen, dass vielleicht der Algorithmus gewechselt werden sollte. Wurde auf der ersten Seite glaube ich auch schon 2 mal angesprochen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Affje

Treue Seele

  • »Affje« ist der Autor dieses Themas

Beiträge: 89

Beruf: Student

  • Private Nachricht senden

35

03.01.2012, 18:45

Ich wollte damit sagen, dass vielleicht der Algorithmus gewechselt werden sollte. Wurde auf der ersten Seite glaube ich auch schon 2 mal angesprochen.

Der Algorithmus kommt im Vergleich zu den anderen bekannten wie Knuth, Kooi oder Irving "nur" mit Vergleichen aus, während in den anderen zusätzlich zu den Vergleichen noch gerechnet werden muss und die Anzahl der Kombinationen bleibt dieselbe, d.h. das wird auch nichts bringen.

Ich hab den Code jetzt auf Arrays umgestellt, das Log:

Liste erstellt: 546 ms
952 ms - new Size: 42344
31 ms - new Size: 6746

Also keine Änderung im ersten Durchgang. Der neue Code:

C-/C++-Quelltext

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
        private void Compare()
        {
            int blacks = 0;
            int whites = 0;
                       
            int[] aGuess = guess.Colors();
            int[] aResult = result.Colors();
            
            //Schwarze Pins
            for (int i = 0; i < size; i++)
            {
                if (aGuess[i] == aResult[i])
                {
                    blacks++;
                }
            }
           
            //Weisse Pins
            for (int i = 0; i < size; i++)
            {
                if (aResult[i] != -1)
                    for (int j = 0; j < size; j++)
                    {
                        if (aResult[i] == aGuess[j])
                        {
                            aGuess[j] = -1;
                            whites++;
                            break;
                        }
                    }
            }
            blackPegs = blacks;
            whitePegs = whites;
            this.hints = new int[blackPegs + whitePegs];
            for (int i = 0; i < blackPegs; i++)
            {
                hints[i] = 1;
            }
            for (int i = 0; i < whitePegs; i++)
            {
                hints[i] = 2;
            }
            
        } 

[i][i][i][i][i]Die letzten 2 for-Schleifen stören mich, kann man die irgendwie in den bisherigen Code mit optimieren? Edit: Der Editor hier ist mal ein böser Käse....[/i][/i][/i][/i][/i]

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

36

03.01.2012, 19:16

Ja, die letzten beiden kannst Du Dir schenken, wenn Du die Schleifen darüber änderst.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Affje

Treue Seele

  • »Affje« ist der Autor dieses Themas

Beiträge: 89

Beruf: Student

  • Private Nachricht senden

37

03.01.2012, 19:22

C-/C++-Quelltext

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
28
29
30
31
private void Compare() 
{ 
int blacks = 0; 
int whites = 0; 

int[] aGuess = guess.Colors(); 
int[] aResult = result.Colors(); 
this.hints = new int[size]; 

for (int i = 0; i < size; i++) 
{ 
if (aGuess[i] == aResult[i]) 
{ 
blacks++; 
hints[i] = 1; 
} 
if (aResult[i] != -1) 
for (int j = 0; j < size; j++) 
{ 
if (aResult[i] == aGuess[j]) 
{ 
aGuess[j] = -1; 
hints[i] = 2; 
whites++; 
break; 
} 
} 
} 
blackPegs = blacks; 
whitePegs = whites; 
}


Edit: Doch nicht, da stimmt was nicht. Außerdem braucht er so, mit Arrays knapp 250ms länger für den ersten Tipp. Ist das aber auch ein Käse :D

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Affje« (03.01.2012, 20:00)


DasBlub

Alter Hase

Beiträge: 802

Wohnort: Schweiz

Beruf: Programmierer

  • Private Nachricht senden

38

03.01.2012, 19:51

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
[...]
            this.hints = new int[blackPegs + whitePegs];
            for (int i = 0; i < blackPegs; i++)
            {
                hints[i] = 1;
            }
            for (int i = 0; i < whitePegs; i++)
            {
                hints[i] = 2;
            }
            
        } 

Die letzten 2 for-Schleifen stören mich, kann man die irgendwie in den bisherigen Code mit optimieren? Edit: Der Editor hier ist mal ein böser Käse....


uhm... die letzten 2 schlaufen bringen dir gar nix, die 2. überschreibt wieder die werte von der ersten?!

Affje

Treue Seele

  • »Affje« ist der Autor dieses Themas

Beiträge: 89

Beruf: Student

  • Private Nachricht senden

39

03.01.2012, 19:52

Hab den Code weiter oben schon verändert. Dieser enthält allerdings auch nen Fehler, den ich noch suchen muss.

So hätte der Code oben glaub besser gepasst:

C#-Quelltext

1
2
3
4
5
            this.hints = new int[blacks + whites];
            for (int i = 0; i < blacks; i++)
                hints[i] = 1;
            for (int i = 0; i < whites; i++)
                hints[blacks + i] = 2;

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Affje« (03.01.2012, 20:18)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

40

03.01.2012, 20:57

Wozu brauchst Du den Array "hints" überhaupt? Es reicht doch zu wissen wie viele schwarze und wie viele weiße Du hast.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige