2012-03-31 9 views
8

Javaソフトウェアの時間複雑度(大きなO表記)に関する質問があります。それを迅速に計算したりテストしたりする方法がありますか(または私にとってそれを計算できるウェブサイトは歓迎されるでしょう)。例えば、私は、次のコードスニペットのためにそれをチェックし、可能性も改善したい:Javaコードのbig-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

「時間複雑度」は、通常、最悪の場合の時間の複雑さを意味します。この問題は不可能であることが判明しています。 – emory

+0

私は(ビッグオー)複雑さを意味しました。投稿を編集します。 – aretai

+0

数字の異なる数字を数えたい場合、そのコードは時間と空間の両方で最適な解決策ではありません。 –

答えて

13

@emoryが指摘したように、任意のピースのビッグOの時間複雑度を決定するために証明可能不可能ですコードは自動的に(証明はHalting Problemからの還元です)。しかし、いくつかの異なる入力でそれを実行することによって、経験的にコードの複雑さを測定しようとすることができるツールがあります。このようなツールの1つが、Goldsmith、Aiken、Wilkersonの論文「Measuring Experimental Computational Complexity」に記載されています。これは、プログラムのランタイムと入力サイズの間の回帰を試みることによって機能します。 trend-profと呼ばれるこのツールは、オンラインで入手できます。

希望すると便利です。

+0

)あなたは、入力を変えて実行することによって複雑さを測定するツールがあると言いました。ユーザーがコードをさまざまな入力で実行して時間を計算した場合とはどう違うのですか?どちらの場合も同じ結果が得られますか?自動対手動? – Faizan

+0

@ Faizan-ツールは単にプログラムを実行するだけではありません。個々の関数/コードブロックを測定するためのバイナリインスツルメンテーションをたくさん追加しています。手作業よりもはるかに簡単です。原則として、同じことを手動で行うこともできますが、それはずっと難しくなります。 – templatetypedef

+0

@templatetypedefリンクが頻繁に壊れてしまうので、「この論文では」紙の名前を指定するだけでは、いつでも有益です。 – Vishrant

1

私は誰かの宿題を解決するかもしれませんが、質問は正気解決のために物乞いされました...数に明確な数字を数える

は、単にいくつかの簡単な算術演算を何文字列、セットまたは正規表現を必要としません。

以下の方法は、(N =入力の桁数)と一定の間隔O(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として残されます。 )

+0

これは私の宿題ではありませんでした。実際に私はこのアプローチについても考えました。しかし、Stringに変換してからSetを使用する方が効率が良いと考えられます(時間の複雑さ)。 – aretai

+0

私はあなたがまだこのコードの有用性を見つけることを願っています:) –

+0

はいそれはあなたにもありがたい解決策です。それは私の質問(上記のように)に直接答えるものではありませんが、あなたは1アップヴォートを持っています。 – aretai

関連する問題