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