web-dev-qa-db-ja.com

Javaコードのbig-O時間の複雑さを計算するためのツール?

Javaソフトウェアの時間の複雑さ(ビッグO表記)について質問があります。それをすばやく計算またはテストする方法はありますか(または私のためにそれを計算できる任意のWebサイトを歓迎します)。たとえば、次のコードスニペットがないか確認して、おそらく改善したいと思います。

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

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

お役に立てれば!

18
templatetypedef

私は誰かの宿題を解決しているかもしれませんが、質問はまともな解決策を頼んでいた...

数値の異なる数字を数えるには、文字列、セット、正規表現は必要ありません。いくつかの単純な算術演算だけが必要です。

次のメソッドは、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;
}

負の数に対してこの作業を行うことは、読者への模範として残されています;)

2