2016-10-04 1 views
3

ich versuchte UVa Problem Nummer 10324 und ich codiert die folgende Lösung dieses ein System angenommen wird, sondern gibt eine wirklich schlechte Laufzeit von 2,670 Sekunden Ich habe die beiden folgenden Codes Dies ist mein CodeGeschwindigkeit in Java, warum einige Codes schneller laufen

public static void main(String[] args) throws Exception{ 
     // write your code here 
     StringBuilder op = new StringBuilder(); 
      InputStreamReader isr = new InputStreamReader(System.in); 
      BufferedReader reader = new BufferedReader(isr); 
      String input, tmp[]; 
      int n, l, u, j, i = 0; 
      boolean dec; 
      char thi; 
      while ((input = reader.readLine()) != null) { 
       op.append("Case " + (++i) + ":\n"); 
       n = Integer.parseInt(reader.readLine()); 
       while (n-- > 0) { 
        tmp = reader.readLine().split(" "); 
        l = Integer.parseInt(tmp[0]); 
        u = Integer.parseInt(tmp[1]); 
        if (l > u) { 
         l ^= u; 
         u ^= l; 
         l ^= u; 
        } 
        //System.out.println(l + "|" + u); 
        dec = true; 
        thi = input.charAt(l++); 
        for (; l <= u; l++) { 
         if (thi != input.charAt(l)||(thi != input.charAt(u--))) { 
          dec = false; 
          break; 
         } 
        } 
        op.append((dec ? "Yes\n" : "No\n")); 
       } 
      } 
      System.out.print(op.toString()); 
      return; 

    } 
} 

und der andere Code ist ein ich die Mr Gorgon's Solution gefunden Dies hat eine Laufzeit von 0,84 Sekunden

aus 210
public static void main(String[] args) throws Exception { 
    InputStreamReader isr = new InputStreamReader(System.in); 
    BufferedReader br = new BufferedReader(isr); 
    StringBuilder sb = new StringBuilder(""); 
    int testCase = 1; 
    String line; 
    while ((line = br.readLine()) != null) { 
     sb.append("Case ").append(testCase).append(":\n"); 
     testCase++; 
     int noOfCases = Integer.parseInt(br.readLine()); 
     for (int j = 0; j < noOfCases; j++) { 
      String[] str = br.readLine().split(" "); 
      int val1 = Integer.parseInt(str[0]); 
      int val2 = Integer.parseInt(str[1]); 
      if (val1 > val2) { 
       val1 ^= val2; 
       val2 ^= val1; 
       val1 ^= val2; 
      } 
      boolean isValid = true; 
      if (val1 != val2) { 
       for (int i = val1; i < val2; i++) { 
        if (line.charAt(i) != line.charAt(i + 1)) { 
         isValid = false; 
         break; 
        } 
       } 
      } 
      if (isValid) 
       sb.append("Yes\n"); 
      else 
       sb.append("No\n"); 
     } 
    } 
    System.out.print(sb); 
} 

Ich fand es sehr schwer zu verstehen, warum dieser Code so viel schneller läuft, wenn alle Aufgaben im Wesentlichen same.and mein Code hat weniger Erklärungen als Gorgons Code

+0

deklaratio ns bringt nicht wirklich viel Performance-Overhead in der Tat (und ich sehe nicht, Sie haben wirklich keine Erklärung kleiner ...) –

+0

Ich habe einige Testfälle mit mehreren wirklich langen Strings und vielen kürzeren erstellt und die zwei Versionen lokal ausgeführt (Windows und Linux, jdk8), und deine Version ist etwa 2 mal schneller. Es wäre interessant, die tatsächlichen Testfälle (UVa) und die Java-Laufzeit zu kennen, die sie verwenden. – starikoff

Antwort

2
  • op.append("Case " + (++i) + ":\n");

Dies negiert die Vorteile des String

  • if (val1 != val2) { In der zweiten Version shortcuts das Looping
+0

Ihr zweiter Punkt ist nicht gültig. Die Schleifenbedingung des OP wird auch nicht in die Schleife gehen, wenn die zwei Werte gleich sind. –

+1

Nein versucht, die Änderungen immer noch zur gleichen Zeit –

+0

Der erste Punkt ist auch nicht gültig. – starikoff

-1

Unter Stück Code fehlt in Ihrer Lösung. Sie schleifen blind dahin, als ob die Bedingung das Schleifen einschränkt.

if (val1 != val2) { 
            } 
      } 
2

sein die

input.charAt(l)!=input.charAt(l+1) 

Linie, die das Programm zu beschleunigen hilft ich denke, es mit Caching zu tun hat

ich recherchiert und gefunden genannt etwas JCS die wahrscheinlich ermöglicht, ihre Apache-Server, um die Speicherdaten zu beschädigen und hilft beim schnelleren Zugriff

+2

JCS ist dafür irrelevant, aber Sie haben Recht, dass diese Zeile den Code im Vergleich zu Ihrer Version wesentlich schneller ausführen lässt – starikoff

Verwandte Themen