| author | Christian Urban <urbanc@in.tum.de> | 
| Sun, 07 May 2017 00:20:58 +0100 | |
| changeset 488 | 057b4603b940 | 
| parent 474 | 331b2c9e525f | 
| child 558 | c9da2c4586f2 | 
| permissions | -rw-r--r-- | 
| 420 
25bc57b32efa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
412diff
changeset | 1 | // a case of catastrophic backtracking in Java | 
| 
25bc57b32efa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
412diff
changeset | 2 | // | 
| 
25bc57b32efa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
412diff
changeset | 3 | // regexp: (a*)*b | 
| 
25bc57b32efa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
412diff
changeset | 4 | // strings: aa.... | 
| 
25bc57b32efa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
412diff
changeset | 5 | |
| 411 
1aec0e1fda86
updated catastrophic examples
 Christian Urban <urbanc@in.tum.de> parents: diff
changeset | 6 | import java.util.regex.*; | 
| 
1aec0e1fda86
updated catastrophic examples
 Christian Urban <urbanc@in.tum.de> parents: diff
changeset | 7 | |
| 
1aec0e1fda86
updated catastrophic examples
 Christian Urban <urbanc@in.tum.de> parents: diff
changeset | 8 | public class catastrophic {
 | 
| 
1aec0e1fda86
updated catastrophic examples
 Christian Urban <urbanc@in.tum.de> parents: diff
changeset | 9 |     public static void main(String[] args) {
 | 
| 420 
25bc57b32efa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
412diff
changeset | 10 | |
| 474 | 11 | //we always run all the tests twice -> to warmup of the JVM | 
| 411 
1aec0e1fda86
updated catastrophic examples
 Christian Urban <urbanc@in.tum.de> parents: diff
changeset | 12 |         for (int runs = 0; runs < 2; runs++) {
 | 
| 420 
25bc57b32efa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
412diff
changeset | 13 | |
| 
25bc57b32efa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
412diff
changeset | 14 |             Pattern pattern = Pattern.compile("(a*)*b");
 | 
| 
25bc57b32efa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
412diff
changeset | 15 | |
| 
25bc57b32efa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
412diff
changeset | 16 | // Run from 5 to 28 characters | 
| 
25bc57b32efa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
412diff
changeset | 17 |             for (int length = 5; length < 28; length++) {
 | 
| 
25bc57b32efa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
412diff
changeset | 18 | |
| 411 
1aec0e1fda86
updated catastrophic examples
 Christian Urban <urbanc@in.tum.de> parents: diff
changeset | 19 | // Build input of specified length | 
| 
1aec0e1fda86
updated catastrophic examples
 Christian Urban <urbanc@in.tum.de> parents: diff
changeset | 20 | String input = ""; | 
| 412 | 21 |                 for (int i = 0; i < length; i++) { input += "a"; }
 | 
| 411 
1aec0e1fda86
updated catastrophic examples
 Christian Urban <urbanc@in.tum.de> parents: diff
changeset | 22 | |
| 
1aec0e1fda86
updated catastrophic examples
 Christian Urban <urbanc@in.tum.de> parents: diff
changeset | 23 | // Measure the average duration of two calls... | 
| 
1aec0e1fda86
updated catastrophic examples
 Christian Urban <urbanc@in.tum.de> parents: diff
changeset | 24 | long start = System.nanoTime(); | 
| 
1aec0e1fda86
updated catastrophic examples
 Christian Urban <urbanc@in.tum.de> parents: diff
changeset | 25 |                 for (int i = 0; i < 2; i++) {
 | 
| 
1aec0e1fda86
updated catastrophic examples
 Christian Urban <urbanc@in.tum.de> parents: diff
changeset | 26 | pattern.matcher(input).find(); | 
| 
1aec0e1fda86
updated catastrophic examples
 Christian Urban <urbanc@in.tum.de> parents: diff
changeset | 27 | } | 
| 474 | 28 | |
| 29 | // Print out time | |
| 412 | 30 | System.out.println(length + " " + input + ": " | 
| 31 | + ((System.nanoTime() - start) / 2000000000d) | |
| 32 | + "s"); | |
| 411 
1aec0e1fda86
updated catastrophic examples
 Christian Urban <urbanc@in.tum.de> parents: diff
changeset | 33 | } | 
| 
1aec0e1fda86
updated catastrophic examples
 Christian Urban <urbanc@in.tum.de> parents: diff
changeset | 34 | } | 
| 
1aec0e1fda86
updated catastrophic examples
 Christian Urban <urbanc@in.tum.de> parents: diff
changeset | 35 | } | 
| 420 
25bc57b32efa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
412diff
changeset | 36 | } |