2017-02-06 142 views
0

所以我正在解決一個編碼挑戰,並且由於超時而導致大量輸入的測試用例失敗。有沒有什麼辦法可以避免在java中嵌套的「for」循環

我需要做一個「計數」次的模擬。 每個模擬將產生0,並且每個數字應當被存儲並計數「大小」倍 364之間的隨機數,如果兩個數被存儲在表示相同的索引計數爲「2」,那麼撞擊++ 返回命中率關於「計數」

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); 

    } 

那麼有什麼辦法可以減少時間複雜度?數據結構可以被改變,它並不是排他的數組。

+1

@Jiri你不喜歡 '嗨'? –

+0

@AdriaanKoster那實際上不是我,看修訂歷史。我不喜歡標題中的額外引號:) –

+1

@TheBakker這會如何幫助? –

回答

0

保護我立刻看到的最大的時間是移動Random rnd = new Random()圈外。您不需要每次都創建一個新實例,並且速度很慢。

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

然後移動'int birthDays [] = new int [max];',並執行一個'Arrays.fill'來將它置於循環內部。 –

+0

這會更快嗎? –

+0

如果它與你在這裏提出的任何更改有很大不同,那麼我會很驚訝。 –