为什么如果我使用循环作为输入,算法比较慢

时间:2018-08-14 14:52:14

标签: java time-complexity

我想使用System.currentTimeMillis()计算analizeString()的执行时间。

public static void main(String[] args) {        
    String myString ="";
    for(int character = 0; character < 50000; character+=10000){
        for(int i = 0; i < character; i++){ 
             myString =+ randomCharacter();
        }           

        long time1 = System.currentTimeMillis();
        analizeString(myString);
        long time2 = System.currentTimeMillis();

        printTimeInFile(time2 - time1);

    }}

在这种情况下,当输入为40000时,我发现的时间约为4秒。但是,如果我不使用这样的循环:

public static void main(String[] args) {        
    String myString ="";
    long input = 40000;
    //for(int character = 0; character < 50000; character+=10000){
        for(int i = 0; i < input; i++){ 
             myString =+ randomCharacter();
        }           

        long time1 = System.currentTimeMillis();
        analizeString(myString);
        long time2 = System.currentTimeMillis();

        printTimeInFile(time2 - time1);

    }

时间约为0.3秒。

使用循环,程序非常慢。 为什么会有这种差异?我的假设是上次也添加了。 有什么帮助吗?谢谢!

1 个答案:

答案 0 :(得分:3)

在第一个示例中,您具有10000 + 20000 + 30000 + 40000 = 100000次迭代,并且您的方法针对100000个字符的字符串运行最后一次迭代。

  • 第一次迭代的时间为10000个字符
  • 第二次迭代中,您有30000(10000 + 20000)个字符的时间
  • 第三次迭代中,您有60000(30000 + 30 000)个字符的时间
  • 第四次(最后一次)迭代具有10万个字符(6万+ 4万个)的时间

在第二个示例中,您有一个40000个字符的字符串。这就是为什么时机不同的原因。

检查analizeString()方法,将字符串增加2.5倍,则计时增加13倍以上(4秒/0.3秒)