簡體   English   中英

排列函數的運行時間

[英]Running time of permutation function

我的書為一個函數提供了以下代碼,該函數計算一串獨特字符的所有排列(見下面的代碼),並說運行時間是O(n!),“因為有n!排列。”

我不明白他們如何計算運行時間為O(n!)。 我認為它們的意思是“n”是原始字符串的長度。 我認為運行時間應該是O((n + 1)XY),因為getPerms函數將被調用(n + 1)次,而X和Y可以表示外部和內部for循環的運行時間分別。 有人可以向我解釋為什么這是錯的/本書的答案是對的嗎?

謝謝。

public static ArrayList<String> getPerms(String str)
{
    if (str == null)
        return null;

    ArrayList<String> permutations = new ArrayList<String>();

    if (str.length() == 0)
        permutations.add("");
        return permutations;

    char first = str.charAt(0); //first character of string
    String remainder = str.substring(1); //remove first character

    ArrayList<String> words = getPerms(remainder);
    for (String word: words)
    {
        for (i = 0; i <= word.length(); i++)
        {
            String s = insertCharAt(word, first, i);
            permutations.add(s)
        }
    }

    return permutations;

}

public static String insertCharAt(String word, char c, int j)
{
    String start = word.substring(0, i);
    String end = word.substring(i); 
    return start + c + end;
}

資料來源:破解編碼面試

從我們的直覺來看,很明顯沒有現有算法可以生成N個項目的排列,這些項目的性能優於O(n!),因為有n個! 可能性。

您可以將遞歸代碼縮減為遞歸方程,因為gePerm(n)其中n是n長度的字符串將調用getPerm(n-1) 然后,我們使用它的所有值返回並放置一個循環N次的內部循環。 所以我們有

P n = nP n-1
P 1 = 1

很容易看出P n = n! 通過伸縮方程。


如果你很難想象我們如何提出這個等式,你也可以這樣思考

ArrayList<String> words = getPerms(remainder);
for (String word: words)                          // P(n-1)
{
    for (i = 0; i <= word.length(); i++)          // nP(n-1)
    {
        String s = insertCharAt(word, first, i);
        permutations.add(s)
    }
}

N元素的排列計數是N * (N - 1) * (N - 2) * ... * 2 * 1 ,即N!

第一個字符可以是N字符中的任何一個。 下一個字符可以是剩余的N - 1字符之一。 現在我們已經有了N * (N - 1)可能的案例。

所以,繼續我們將在每一步都有N * (N - 1) * (N - 2) * ...個案。

導致N元素的排列計數為N! ,那么沒有一個實現可以比N!更快地排列長度為N的數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM