2012-03-31 8 views
8

Ho una domanda riguardante la complessità del tempo (grande notazione O) per il software Java. C'è un modo per calcolarlo o testarlo rapidamente (o qualsiasi sito web che potrebbe calcolarlo per me sarebbe ben accetto). Per esempio desidero controllare per il seguente frammento di codice ed eventualmente migliorare così:Uno strumento per il calcolo della complessità del tempo grande del codice Java?

int dcount = 24423567; 
     int a = 0; 
     if (dcount == 0){ 
      a = 1; 
     } 

     String ds = Integer.toString(dcount); 
     String[] sa = ds.split("(?<=.)"); 
     HashSet hs = new HashSet(); 
     Collections.addAll(hs, sa); 
     a = hs.size(); 
     if (dcount < 0) 
      a--; 

     System.out.println(a); 
+0

"Complessità del tempo" in genere indica la complessità del caso peggiore. Questo problema è stato dimostrato impossibile. – emory

+0

Intendevo la complessità (big-O). Anche il post verrà modificato. – aretai

+0

Se si desidera contare cifre distinte in un numero, quel codice sicuramente non è una soluzione ottimale sia nel tempo che nello spazio. –

risposta

13

Come @emory indicate, è dimostrabilmente impossibile determinare il tempo complessità O grande di una quantità arbitraria di codice automaticamente (la prova è una riduzione da Halting Problem). Tuttavia, esistono strumenti che possono tentare di misurare empiricamente la complessità di un pezzo di codice eseguendolo su diversi input diversi. Uno di questi strumenti è descritto nel documento "Misurazione della complessità computazionale empirica" ​​di Goldsmith, Aiken e Wilkerson. Funziona tentando di eseguire una regressione sul runtime del programma rispetto alla sua dimensione di input. Lo strumento, chiamato trend-prof, è disponibile online.

Spero che questo aiuti!

+0

Hai detto che esistono strumenti per misurare la complessità eseguendola con diversi input. Com'è diverso da se un utente stesso esegue il suo codice con input diversi e calcola il tempo. Entrambi daranno gli stessi risultati? Automatico vs Manuale? – Faizan

+0

@ Faizan- Lo strumento fa molto di più che eseguire il programma. Aggiunge molta strumentazione binaria per misurare singole funzioni/blocchi di codice, ed è sicuramente molto più facile che farlo a mano. In linea di principio si potrebbe fare la stessa cosa manualmente, ma sarebbe * molto * più difficile. – templatetypedef

+0

@templatetypedef è sempre utile se si fornisce il nome del foglio e non solo "in questo documento" poiché i collegamenti si sono interrotti abbastanza spesso. – Vishrant

1

potrei essere risolvendo compiti a casa di qualcuno, ma la questione pregavo per una soluzione sana di mente ...

Conteggio cifre distinte in un numero non richiede stringhe, insiemi o espressioni regolari, solo alcuni semplici aritmetica.

Il seguente metodo viene eseguito in O (n) (n = numero di cifre nell'input) e lo spazio costante:

int distinctDigits(int num) { 
    if (num == 0) { 
    return 1; 
    } 

    boolean[] digits = new boolean[10]; 

    while (num > 0) { 
    digits[num % 10] = true; 
    num /= 10; 
    } 

    int count = 0; 
    for (boolean digit : digits) { 
    if (digit) { 
     count++; 
    } 
    } 

    return count; 
} 

Facendo questo lavoro per i numeri negativi viene lasciato come exericse al lettore;)

+0

nah non erano i miei compiti, grazie. In realtà ho pensato anche a questo approccio; tuttavia pensavo che la conversione in String e quindi l'utilizzo di Set sarebbe stata più efficiente (complessità temporale). – aretai

+0

Spero che questo blob di codice sia ancora utile :) –

+0

sì, è una buona soluzione, grazie. Anche se non risponde direttamente alla mia domanda (come quella sopra) ma 1 upvote hai. – aretai