Sto cercando di creare un programma in Java che misuri la complessità di un programma specifico rispetto al suo tempo di esecuzione. Prendiamo un problema e codifichiamo quel problema in tutti i modi possibili rispetto alla complessità del tempo, diciamo che possiamo scrivere codice per un problema specifico in O (n), O (log (n)), O (n log (n)) e O (n ^ 2).
Registrerò il tempo di esecuzione di ciascun caso e creerò una scala con questi valori per misurare la complessità temporale della soluzione di altri. Come
- O (n) - > 2-3 ms
- O (log (n)) - > 1-2 ms ecc.
Ora se altro codice ha un tempo di esecuzione di 2,3 ms, allora il mio programma Java dirà che la soluzione data ha una complessità temporale dell'ordine O (n).
Ora il problema è che, dato che il mio codice è in Java, ogni volta che eseguo qualsiasi programma usando i comandi di Ubuntu attraverso il codice Java, ogni volta ottengo il tempo di esecuzione diverso e il tempo di esecuzione è molto ampio da 0,364246 a 0,902362. / p>
Perché sta accadendo e cosa posso fare per fare una scala efficiente?
Ecco il mio codice:
import java.io.*;
class ps_ef
{
public static void main(String args[])
{
String s=null,file_name,extension;
int pos = args[0].lastIndexOf(".");
extension = args[0].substring(pos+1);
file_name = args[0].substring(0,pos);
int lang = 0; // 1 -> c,c++ , 2 -> java
try
{
Process compile = null;
switch(extension)
{
case "c" : compile = Runtime.getRuntime().exec("gcc -g "+ args[0] + " -o "+file_name);
lang = 1;
break;
case "c++" : compile = Runtime.getRuntime().exec("g++ -g "+ args[0] + " -o "+file_name);
lang = 1;
break;
case "java" : compile = Runtime.getRuntime().exec("javac "+ args[0]);
lang = 2;
}
BufferedReader stdError = new BufferedReader(new InputStreamReader(compile.getErrorStream()));
if((s = stdError.readLine()) != null)
{
System.out.println("Compile Time Error OR Warning : ");
System.out.println(s);
while((s = stdError.readLine()) != null)
{
System.out.println(s);
}
}
double startTime, run_time;
Process run;
if(lang == 1)
{
startTime = System.nanoTime();
run = Runtime.getRuntime().exec("./"+file_name);
run_time = (System.nanoTime()-startTime)/(double)Math.pow(10,6);
}
else
{
startTime = System.nanoTime();
run = Runtime.getRuntime().exec("java "+file_name);
run_time = (System.nanoTime()-startTime)/(double)Math.pow(10,6);
}
System.out.println("RunTime : "+ run_time+" ms");
BufferedReader run_stdInput = new BufferedReader(new InputStreamReader(run.getInputStream()));
BufferedReader run_stdError = new BufferedReader(new InputStreamReader(run.getErrorStream()));
if(( s = run_stdError.readLine()) != null)
{
System.out.println("Runtime Error : ");
System.out.println(s);
while((s = run_stdError.readLine()) != null )
{
System.out.println(s);
}
}
else if((s = run_stdInput.readLine()) != null)
{
String s_string = null;
int failed = 0;
File fs = new File(file_name+".txt");
BufferedReader br = new BufferedReader(new FileReader(fs));
if((!s.equals(s_string = br.readLine())))
{
failed = 1;
}
while(((s = run_stdInput.readLine()) != null) & ((s_string = br.readLine()) != null) & (failed == 0))
{
if(!s.equals(s_string) )
{
failed = 1;
break;
}
}
if((failed == 1) || s != null || s_string != null)
{
System.out.println("Submmision Failed : ");
System.out.println("Either Output Is Wrong.\nOR\nYour Output Is Not According To The Given Format. ");
System.exit(0);
}
else
{
System.out.println("Submission Successful.");
}
}
}
catch(IOException e)
{
System.out.println("Some Error Has Occured : ");
e.printStackTrace();
System.exit(-1);
}
}
}
Ecco il mio output di run time: