【问题标题】:What is the complexity (Big-O) of this algorithm?该算法的复杂度(Big-O)是多少?
【发布时间】:2012-07-10 15:21:02
【问题描述】:

我对算法分析相当熟悉,并且可以告诉我使用的大多数算法的 Big-O。但是我被困了好几个小时,无法为我编写的这段代码想出 Big-O。

基本上它是一种为字符串生成排列的方法。它的工作原理是将字符串中的每个字符作为第一个字符,并将其与子字符串的排列组合(递归地)。

如果我输入代码来计算迭代次数,我得到的结果介于 O(N!) 和 O(N^N) 之间。但我无法弄清楚如何在心理上分析它。任何建议都非常感谢!

import java.util.ArrayList;
import java.util.List;

public class Permutation {

   int count = 0;

   List<String> findPermutations(String str) {
      List<String> permutations = new ArrayList<String>();
      if (str.length() <= 1) { 
         count++;
         permutations.add(str);
         return permutations;
      }
      for (int i = 0; i < str.length(); i++) {
         String sub = str.substring(0, i) + str.substring(i + 1);
         for (String permOfSub : findPermutations(sub)) {
            count++;
            permutations.add(str.charAt(i) + permOfSub);
         }
      }
      return permutations;
   }

   public static void main(String[] args) {
      for (String s : new String[] {"a", "ab", "abc", "abcd", "abcde", "abcdef", "abcdefg", "abcdefgh"}) {
         Permutation p = new Permutation();
         p.findPermutations(s);
         System.out.printf("Count %d vs N! %d%n", p.count, fact(s.length()));
      }
   }

   private static int fact(int i) {
      return i <= 1 ? i : i * fact(i-1);
   }
}

编辑1:添加测试程序

编辑 2: 在基本情况下添加 count++

【问题讨论】:

    标签: algorithm complexity-theory big-o permutation


    【解决方案1】:

    递归方程:T(n) = n*(T(n-1) + (n-1)!), T(1) = 1 其中n = str.length

    WolframAlfa 说解是 n*(1)nn*n!

    以上假设所有字符串操作都是 O(1)。否则,如果 String sub = ...permutations.add(str.charAt(i) + permOfSub) 行的成本被认为是 O(n),那么等式是:

    T(n+1)=(n+1)*(n + T(n) + n!*(n+1))
    

    T(n) ~ (n*n+2*n-1)*n!即O(n!*n*n)

    【讨论】:

    • 您忘记了在每个级别迭代现有元素的 +O(n) 项。这会使您的答案减少 n 倍。
    • 谢谢,我已更新问题以包含测试程序。基本上我在最里面的循环中增加了一个计数,并在完成后打印出它的值 vs N!。结果计数总是完全等于N! * (N-1)。例如字符串是'abc',N!是 3x2x1 = 6,计数是 12。我仍然无法弄清楚 N-1 是从哪里来的。
    • 顺便说一句,感谢您指出 WolframAlpha。我不知道它可以做到这一点。太酷了!
    • @templatetypedef:与纯 Python 循环的成本相比,python 习惯于忽略用 C 实现的几个函数的成本
    • @templatetypedef 根据我的测试程序,它偏离了 (n-1) 倍;我不明白为什么会这样,我也不明白你断言它被 n 关闭的逻辑。你能帮忙详细说明一下吗?谢谢!
    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 2016-06-30
    • 1970-01-01
    • 2014-01-04
    • 2020-03-03
    • 2017-02-01
    • 1970-01-01
    • 2013-04-30
    相关资源
    最近更新 更多