web-dev-qa-db-fra.com

Un outil de calcul de la complexité en temps énorme du code Java?

J'ai une question concernant la complexité temporelle (grande notation O) du logiciel Java. Y at-il un moyen de le calculer rapidement ou de le tester (ou tout site Web qui pourrait le calculer pour moi serait le bienvenu). Par exemple, j'aimerais vérifier l'extrait de code suivant et éventuellement l'améliorer:

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);
11
aretai

Comme @emory l'a fait remarquer, il est manifestement impossible de déterminer automatiquement la complexité en termes de temps-gros d'un morceau de code arbitraire (la preuve est une réduction du problème de Halting Problem ). Cependant, certains outils peuvent tenter de mesurer la complexité d'un morceau de code de manière empirique en l'exécutant sur plusieurs entrées. Un de ces outils est décrit dans l’article intitulé «Measuring Empirical Computational Compality» de Goldsmith, Aiken et Wilkerson. Cela fonctionne en essayant de faire une régression sur l'exécution du programme par rapport à sa taille d'entrée. L'outil appelétrend-profest disponible en ligne.

J'espère que cela t'aides!

14
templatetypedef

Je suis peut-être en train de résoudre les devoirs de quelqu'un, mais la question implorait une solution sensée ...

Compter des chiffres distincts dans un nombre ne nécessite aucune chaîne, aucun ensemble ou expression régulière, mais quelques simples calculs arithmétiques.

La méthode suivante s'exécute dans O(n) time (n = nombre de chiffres de l'entrée) et dans l'espace constant:

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;
}

Faire ce travail pour les nombres négatifs est laissé comme un exericse au lecteur;)

1
Philipp Reichart