计算我的程序的大O复杂性

时间:2013-04-22 19:18:57

标签: java big-o

我的程序打印一个双字母单词的所有排列 例如 在'Helloo'一词中

结果将是: [heloo,helo,你好,你好]

private List<String> doubleLetterPermute(String start, String ending, List<String> possibleWords) {
    String prev = "";
    for (int i = 0; i < ending.length(); i++) {
        String letter = String.valueOf(ending.charAt(i));
        // its a double letter
        if (letter.equals(prev)) {
            doubleLetterPermute(start + ending.substring(0, i), ending.substring(i + 1), possibleWords);
            doubleLetterPermute(start + ending.substring(0, i + 1), ending.substring(i + 1), possibleWords);
        }
        prev = letter;
    }
    possibleWords.add(start + ending);
    return possibleWords;
}

我不确定在递归函数进入时如何计算复杂性。 它循环n次,其中n是单词中的字符数O(n),但是我在每次出现双字母时将单词拆分,那么它是如何在大O表示法中显示的?

1 个答案:

答案 0 :(得分:1)

为了计算您的复杂性,您需要查看最差和最佳情况。

充其量,你会有一个长度为N但没有双字母的单词,让我们说“ abcde ”。你的复杂性将是O(n),因为你只有一个大小为N的循环。

在最糟糕的情况下,你会在同一个字母上写一个长度为N的单词,让我们说“ aaaaa ”。在这种情况下,您有一个大小为N的循环,其中包含2个大小为(N - i)的循环。因此,复杂性将是O(2(n-i)* n)或O(n ^ 2)。