2017-02-06 4 views
0

zu vermeiden, damit ich eine Codierung Herausforderung lösen und mein Code in Testfällen mit einer großen Anzahl von Eingaben wegen Timeout fehlgeschlagen.Gibt es eine Möglichkeit, verschachtelte "for" Schleifen in Java

Ich muss eine Simulation von "zählen" mal machen. jede Simulation wird eine Zufallszahl zwischen 0 und 364 von "Größe" mal jede Zahl sollte gespeichert und gezählt werden, wenn zwei Zahlen im gleichen Index gespeichert sind, was bedeutet, dass die Zahl '2' dann Hits ++ den Prozentsatz der Treffer zurückgibt in Bezug auf "count"

public double calculate(int size, int count) { 
     // TODO -- add your code here 
     int Hits=0; 
     for(int j=1;j<=count;j++) {  // number of simulation 

      int BirthDays[]=new int[365]; 
      Random rnd = new Random(); 
      rnd.setSeed(j); 

      for(int i=0;i<size;i++){  //number of people 
       int x=rnd.nextInt(365); 
       BirthDays[x]=BirthDays[x]+1; 
       if(BirthDays[x]>=2){ 
        Hits++; 
        break; 
       } 
      } 

     } 
     return(((float)Hits/count)*100); 

    } 

so gibt es einen Weg, um die Zeit Komplexität zu reduzieren? Die Datenstruktur kann geändert werden, sie ist nicht exklusiv für Arrays.

+1

@Jiri Sie mögen nicht "Hey"? –

+0

@AdriaanKoster Das war eigentlich nicht ich, siehe Revisionsgeschichte. Ich mochte das zusätzliche Zitat in Titel nicht :) –

+1

@TheBakker Wie würde das helfen? –

Antwort

0

Die größte Zeiteinsparung, die ich sofort sehe, ist Random rnd = new Random() aus der Schleife zu bewegen. Sie müssen nicht jedes Mal eine neue Instanz erstellen und es ist ziemlich langsam.

public double calculate(int size, int count) {  
    int max = 365; 
    int birthDays[] = new int[max]; 
    Random rnd = new Random(); 
    int hits = 0; 
    for(int j = 1; j <= count; j++) { 
     Arrays.fill(birthDays, 0); 
     rnd.setSeed(j); 
     for(int i = 0; i < size; i++) { 
      int x = rnd.nextInt(max); 
      birthDays[x]++; 
      if(birthDays[x] >=2) { 
       hits++; 
       break; 
      } 
     } 

    } 
    return (hits/count) * 100; 

} 
+0

Und verschieben Sie die 'int birthDays [] = new int [max];', und machen Sie ein 'Arrays.fill', um es innerhalb der Schleife auf Null zu setzen. –

+0

Wird das sicher schneller sein? –

+0

Ich wäre wirklich erstaunt, wenn es einen signifikanten Unterschied machen würde, wie bei jeder der hier vorgeschlagenen Änderungen. –

Verwandte Themen