[英]Big-O time complexity of recursive algorithm with nested for loops
我有一個帶有兩個嵌套for循環的遞歸算法。 我想弄清楚Big-O的時間復雜度是多少。
public Set<Person> getDistinctCombinedPersons(Collection<Person> persons) {
return permutatePersons(new ArrayList(persons), new HashSet<>(persons));
}
private Set<Person> permutatePersons(List<Person> personList, Set<Person> personSet) {
if(personList.isEmpty() {
return personSet;
}
Set<Person> deepCopyPersonSet = new HashSet<>(personSet);
for(Person lPerson : personList) {
for(Person sPerson : deepCopyPersonSet) {
Person uniquePerson = CombinePeople.combine(lPerson, sPerson);
personSet.add(uniquePerson);
}
}
personList.remove(personList.size()-1);
return permutatePersons(personList, personSet);
}
假設您使用長度為N
的列表調用permutatePersons
,則以下遞歸適用:
T(N) = T(N-1) + O(N^2)
這是因為在每個遞歸步驟中,您使用長度為N-1的列表調用函數(其中N為當前長度),並且您還要計算總復雜度O(N ^ 2)(外部循環O(N) - 正好遍歷列表和內部循環遍歷O(N)-O(1)中的每個元素和總N元素的哈希映射,因此嵌套循環總體為O(N ^ 2))。
你可以很容易地看到:
T(N) = T(N-1) + O(N^2) = T(N-2) + O(N^2) + O((N-1)^2) =...
= O(n(n+1)(2n+1)/6) = O(n^3)
看起來它對於嵌套循環來說是n ^ 2的大O:
for(Person lPerson : personList) {
for(Person sPerson : deepCopyPersonSet) {
Person uniquePerson = CombinePeople.combine(lPerson, sPerson);
personSet.add(uniquePerson);
}
}
您必須遍歷集合中每個元素的每個元素。
然后遞歸調用有一個很大的O,因為它會為集合中的每個元素調用一次方法。
結合兩個: n * n^2
將導致n ^ 3的大O.
因為您有兩個嵌套循環,所以運行時復雜度為O(m*n)
。 這是因為對於deepCopyPersonSet
n
- Person
,你需要迭代m
次。 n
在這個例子中是的量Person
S IN personList
。
你的代碼基本上是:
for(int i = 0, i < m, i++)
for(int j = 0, j < n, j++)
//your code
對於m的每次迭代,我們有n次迭代的代碼
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.