私は以下のプログラムを持っています。複数の機能を持っている場合、それぞれの時間複雑さを組み合わせるのか、それとも最高の時間複雑性をすべて取り除くのですか?Java:プログラムの複雑さを計算するには?
私はfind()
がnの時間複雑さを持ち、isCompound
がnの時間複雑性を持っていると信じています。あれは正しいですか?
ありがとうございます。投票して回答を受け入れるようにしてください。
private static String[] find(String[] array) {
Set<String> words = new LinkedHashSet<>(Arrays.asList(array));
Set<String> otherWords = new HashSet<>(words);
for (Iterator<String> i = words.iterator(); i.hasNext();) {
String next = i.next();
otherWords.remove(next);
if (isCompound(next, otherWords)) {
i.remove();
} else {
otherWords.add(next);
}
}
}
private static boolean isCompound(String string, Set<String> otherWords) {
if (otherWords.contains(string)) {
return true;
}
for (String word : otherWords) {
if (string.startsWith(word)) {
return isCompound(string.replaceAll("^" + word, ""), otherWords);
}
if (string.endsWith(word)) {
return isCompound(string.replaceAll(word + "$", ""), otherWords);
}
}
return false;
}
機能の仕組みによって異なります。 – bradimus
あなたのプログラムの 'forループ 'のようなループは、'線形時間複雑さ 'すなわち' O(n) 'をもち、シーケンスが' O(1)'ならば – CodeWalker
です。単語の数と各単語の長さ。たとえば、配列に10億文字からなる単語が1つしか含まれていない場合の処理について考えてみましょう。あなたの制限要因は、この場合の単語の数ではありません。 – biziclop