Инструмент для вычисления сложной во времени сложности Java-кода?

У меня вопрос о временной сложности (большая нотация O) для программного обеспечения 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);

Ответ 1

Как указывала @emory, невозможно автоматически определить сложность во времени большого произвольного фрагмента кода (доказательство является сокращением от Проблема с остановкой). Однако есть инструменты, которые могут попытаться измерить сложность фрагмента кода эмпирически, запустив его на нескольких разных входах. Один из таких инструментов описан в статье "Измерение эмпирической вычислительной сложности" Голдсмита, Айкена и Вилкерсона. Он работает, пытаясь сделать регрессию во время выполнения программы по сравнению с ее размером ввода. Инструмент, называемый trend-prof, доступен в Интернете.

Надеюсь, это поможет!

Ответ 2

Я мог бы решить кто-то домашнее задание, но вопрос заключался в том, чтобы попросить разумного решения...

Для подсчета различных цифр в номере не требуется никаких строк, наборов или регулярных выражений, просто какая-то простая арифметика.

Следующий метод работает в O (n) времени (n = количество цифр на входе) и постоянное пространство:

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

Выполнение этой работы для отрицательных чисел оставлено как exericse для читателя;)