2017-02-06 164 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

如果它与你在这里提出的任何更改有很大不同,那么我会很惊讶。 –