我有以下程序。在它具有多个功能的情况下,我是否将每个功能的时间复杂度结合起来,或者只是从所有功能中获取最高阶的时间复杂度?
我认为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;
}
答案 0 :(得分:2)
没有什么比时间复杂的程序了。我们计算算法的时间复杂度,或者在编程的上下文中计算单个(原子)函数的时间复杂度。
我们通过在分析器等工具中测量它们的运行时间来对程序(可能包含多个功能)进行基准测试。 想象一下,如果某个程序包含数百个源文件,您希望如何计算其时间复杂度?
要分析find
和isCompound
的复杂性,我们当然需要了解其中调用的函数的复杂性,例如otherWords.remove(next)
,otherWords.add(next)
,{{1 }或string.replaceAll("^" + word, "")
。
如果您确切知道它们的复杂性,那么我们就可以计算出您的功能的复杂性。即使你计算了所有的复杂性,这也是对非常大的输入的近似。所以,你决定你真正想要计算的是什么。
编辑:为了计算程序的复杂性,我建议你分解你调用的每个库函数并尝试分析它们。例如,由于otherWords.contains(string)
是HashSet,我们可以推断otherWords
(哈希表中的查找操作)可能需要otherWords.contains(string)
(大O)时间。