Java:如何计算程序的时间复杂度?

时间:2016-11-16 20:56:18

标签: java algorithm time-complexity big-o

我有以下程序。在它具有多个功能的情况下,我是否将每个功能的时间复杂度结合起来,或者只是从所有功能中获取最高阶的时间复杂度?

我认为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;
}

1 个答案:

答案 0 :(得分:2)

没有什么比时间复杂的程序了。我们计算算法的时间复杂度,或者在编程的上下文中计算单个(原子)函数的时间复杂度。

我们通过在分析器等工具中测量它们的运行时间来对程序(可能包含多个功能)进行基准测试。 想象一下,如果某个程序包含数百个源文件,您希望如何计算其时间复杂度?

要分析findisCompound的复杂性,我们当然需要了解其中调用的函数的复杂性,例如otherWords.remove(next)otherWords.add(next),{{1 }或string.replaceAll("^" + word, "")

如果您确切知道它们的复杂性,那么我们就可以计算出您的功能的复杂性。即使你计算了所有的复杂性,这也是对非常大的输入的近似。所以,你决定你真正想要计算的是什么。

编辑:为了计算程序的复杂性,我建议你分解你调用的每个库函数并尝试分析它们。例如,由于otherWords.contains(string)HashSet,我们可以推断otherWords(哈希表中的查找操作)可能需要otherWords.contains(string)(大O)时间。