2012-03-31 6 views
8

Mam pytanie dotyczące złożoności czasowej (duża notacja O) dla oprogramowania Java. Czy istnieje sposób, aby szybko obliczyć lub przetestować go (lub jakakolwiek strona internetowa, która mogłaby go obliczyć, byłaby mile widziany). Na przykład chciałbym sprawdzić to na poniższym fragmencie kodu i ewentualnie poprawić także:Narzędzie do obliczania skomplikowanej złożoności kodu Java w czasie O?

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

"Złożoność czasowa" zwykle oznacza złożoność czasu najgorszego. Ten problem okazał się niemożliwy. – emory

+0

Miałem na myśli złożoność (big-O). Edytuje również post. – aretai

+0

Jeśli chcesz policzyć różne cyfry w liczbie, ten kod zdecydowanie nie jest optymalnym rozwiązaniem zarówno w czasie, jak iw przestrzeni. –

Odpowiedz

13

Jak @emory wskazał, że jest provably niemożliwe do określenia czasu złożoności big-O z dowolnego kawałka kod automatycznie (dowodem jest zmniejszenie z Halting Problem). Istnieją jednak narzędzia, które mogą próbować empirycznie zmierzyć złożoność kawałka kodu, uruchamiając go na kilku różnych wejściach. Jedno takie narzędzie opisano w artykule "Pomiar empirycznej złożoności obliczeniowej" Goldsmitha, Aikena i Wilkersona. Działa poprzez próbę regresji w środowisku wykonawczym programu w porównaniu z jego wielkością wejściową. Narzędzie o nazwie trend-prof jest dostępne online.

Mam nadzieję, że to pomoże!

+0

Powiedziałeś, że istnieją narzędzia do pomiaru złożoności poprzez uruchamianie jej z różnymi wejściami. Czym różni się to od tego, czy sam użytkownik uruchamia swój kod z różnymi wejściami i oblicza czas. Czy oba dają takie same wyniki? Automatyczny kontra ręczny? – Faizan

+0

@ Faizan - Narzędzie to znacznie więcej niż tylko uruchomienie programu. Dodaje wiele narzędzi binarnych do mierzenia poszczególnych funkcji/bloków kodu, a to z pewnością dużo łatwiejsze niż robienie tego ręcznie. Zasadniczo można zrobić to samo ręcznie, ale byłoby to znacznie trudniejsze. – templatetypedef

+0

@templatetypedef jest zawsze korzystne, jeśli podasz nazwę papieru, a nie tylko "w tym dokumencie", ponieważ linki często pękają. – Vishrant

1

mogę być rozwiązywanie czyjąś pracę domową, ale pytanie było prosząc o sane rozwiązanie ...

Liczenie wyraźne cyfry numeru nie wymaga strun, zestawy lub wyrażeń regularnych, zaledwie kilka prostych arytmetyki.

Poniższa metoda przebiega O (n) (n = liczba cyfr w wejście) oraz stałej powierzchni:

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

uruchomienie tego liczb ujemnych pozostanie jako exericse do czytnika;)

+0

Nah to nie była moja praca domowa, dziękuję. Właściwie również myślałem o tym podejściu; jednak myślę, że konwersja do String, a następnie użycie Set będzie bardziej efektywna (złożoność czasu). – aretai

+0

Mam nadzieję, że nadal znajdziesz ten blob kodu użytecznego :) –

+0

tak to jest schludne rozwiązanie, a także dziękuję. Chociaż nie odpowiada bezpośrednio na moje pytanie (jak powyższe), ale 1 przegłosowałeś. – aretai