整數數組上的快速排序通過對整個數組的半部分進行遞歸分區來工作 - 並且這樣做對數組進行排序。我知道分區需要O(n),並且因爲它在每個半(logN次)遞歸執行,所以總成本出現在O(NlogN)上。在快速排序中修改比較器
在解碼編碼採訪第6版中,問題10.2要求編寫一個方法來對字符串數組進行排序,以使所有字符串相鄰。作者提出了兩種不同的解決方案 - 其中一種解決方案是快速排列整個陣列,因此字符串最終會彼此相鄰。
但她說這是時間O(NlogN)。這是我迷失的地方。對於整數數組,快速排序必須訪問每個元素和交換整數,具體取決於一個是否大於另一個。這是每N個元素的O(1)成本,總計爲O(N)。然而,作者建議的兩個字符串的比較將兩個字符串分解爲一個char數組,並對它們進行排序,然後對它們進行比較。這個過程是每個字符串O(L logL)(其中L是字符串的長度)..所以它是每N個字符串的O(LlogL)成本 - 不是O(NlogN(L LogL))?可能會迷失在數字中,但如果有人能夠向我解釋作者的過程如何在字符串比較中具有O(NlogN)複雜性,那將會非常有幫助。下面是她的代碼:
class AnagramComparator implements Comparator <String> {
public String sortChars(String s) {
char[] content = s.toCharArray();
Arrays.sort(content)
return new String(content);
}
public int compare(String s1, String s2) {
return sortChars(s1).compareTo(sortChars(s2));
}
}
這裏有兩個_different_'N'在這裏混淆:字符串的長度和字符串的數量。 –
只是爲了糾正錯誤表達:Quicksort不一定將數組分成兩半。它將數組分成兩部分,但在最壞的情況下,第一部分(或第二部分)可能只包含一個元素。在最壞的情況下,每當算法遞歸時都會發生這種情況,這就是爲什麼Quicksort的最壞情況時間是O(n^2)而不是O(n log n)。雖然_average_時間是O(n log n)。 – ajb
@LouisWasserman你是完全正確的 - 添加相應的編輯。 – Sunny