簡體   English   中英

具有嵌套for循環的遞歸算法的大O時間復雜度

[英]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.

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