【问题标题】:Time Complexity for binary permutation representation of n bitsn 位二进制置换表示的时间复杂度
【发布时间】:2019-01-06 03:38:09
【问题描述】:

我在 java 中返回了下面的代码,以生成可能的 n 位二进制表示。

public List<String> binaryRepresenation(int n){
    List<String> list = new ArrayList<>();
    if(n>0){
        permuation(n, list, "");
    }
    return list;
}

private void permuation(int n, List<String> list, String str){
    if(n==0){
        list.add(str);
    }else{
        permuation(n-1, list, str+"0");
        permuation(n-1, list, str+"1");
    }
}

对于 n=3,它产生 001 001 010 011 100 101 110 111 个组合。 总的来说,这个函数产生 2^n 种可能的表示。

可以说时间复杂度是n * 2^n

对于基本情况,该方法被调用了 2^n 次。为了达到每个基本情况,它会调用排列方法最多 n 次。

所以总体上界时间复杂度是 n*2^n?如果我错了,请纠正我。我根据该线程Time Complexity of Permutations of a String 中讨论的字符串排列时间复杂度得出了这个结论。非常感谢您的帮助。

【问题讨论】:

  • 时间复杂度:2^n

标签: java algorithm time time-complexity


【解决方案1】:

时间复杂度为 O(2n)。每个函数调用都会将两个新的函数调用压入堆栈,直到达到基本情况。将n = 3 的树可视化如下:

            ________""________
           /                  \
       ___0___              ___1___
      /       \            /       \
    _00_     _01_        _10_     _11_
   /    \   /    \      /    \   /    \
  000  001 010   011   100  101 110   111

这是一棵完美的二叉树,有 15 个节点和 8 个叶子。访问了 2n+1 个状态,但我们可以删除常数并简化为 O(2n)。

字符串连接为复杂性增加了一个n 乘数,但使用StringBuilder 或具有恒定时间推送/弹出或添加/删除操作的容器应该可以消除这种情况,这表明这只是特定于您的实现细节发布的代码,而不是一般算法的复杂性。

【讨论】:

  • 可能,但你的理由是什么?您的 newly-added answer 是同义反复的。唯一的解释是“事实上,时间复杂度保持在ϴ(p^n),即使你在递归调用之外执行任何多项式的工作”——但为什么会这样呢?使用 O(1) 字符串连接会产生与线性连接产生指数次数相同的总体时间复杂度,这是违反直觉的,因此需要有一个令人信服的理由来忽略它。
  • 感谢您抽出宝贵时间补充您的答案。我没有理解你的证明的数学背景,但在开始证明之前,你似乎仍然在通过有效地说“有一个一般形式,我们可以简单地放弃多项式工作,因为我们可以”来实现飞跃.我愿意相信,因为你显然比我有更多的背景,但我没有看到。
【解决方案2】:

您的分析存在一个小问题。正如您所注意到的,对于每个基本情况,您必须调用函数 n 次。但是,其中一些调用被其他基本案例共享。换句话说,您多次计算同一个呼叫。

这意味着虽然复杂度绝对不能大于n * 2 ^ n,但实际上可能更低。

要计算出更好的复杂度界限,您可以计算对permutation 函数的实际调用次数。一种方法是考虑str 变量的可能值。

str 将是长度小于或等于n 的二进制字符串。此外,对permutation 函数的每次调用都会收到一个唯一值str。这意味着函数被调用的次数等于长度为

有多少这样的字符串? 1 + 2 + 4 + ... + 2 ^ n = 2 ^ (n + 1) - 1

所以,permutation 被调用的次数是O(2^n)。 但是每个调用都包含操作str + "0"str + "1"。这些操作需要O(n) 时间。因此,该操作的净时间复杂度为:O(n * 2^n),但原因与您最初想象的有些不同。

【讨论】:

  • 这将是 O(2^n),除了 str+"0"str+"1" 都需要 O(n) 时间。所以复杂度确实是 O(n*2^n),但不是因为 OP 想象的原因。
猜你喜欢
  • 2017-06-18
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 2011-07-09
  • 2013-10-07
相关资源
最近更新 更多