【问题标题】:What would be the time complexity of counting the number of all structurally different binary trees?计算所有结构不同的二叉树的数量的时间复杂度是多少?
【发布时间】:2010-03-29 02:23:14
【问题描述】:

使用这里介绍的方法:http://cslibrary.stanford.edu/110/BinaryTrees.html#java

12. countTrees() 解决方案(Java) /** 对于键值 1...numKeys,有多少结构上唯一 存储这些键的二叉搜索树是可能的吗? 策略:认为每个值都可能是根。 递归查找左右子树的大小。 */ 公共静态int countTrees(int numKeys){ 如果(numKeys

我感觉可能是n(n-1)(n-2)...1,即n!

如果使用memoizer,复杂度是O(n)吗?

【问题讨论】:

    标签: binary-tree complexity-theory memoization catalan


    【解决方案1】:

    节点数为 n 的完整二叉树的数量是第 n 个加泰罗尼亚数。加泰罗尼亚数字计算为

    复杂度为 O(n)。

    http://mathworld.wolfram.com/BinaryTree.html

    http://en.wikipedia.org/wiki/Catalan_number#Applications_in_combinatorics

    【讨论】:

      【解决方案2】:

      计算此算法使用的countTrees 的调用次数很容易 给定的节点数。经过几次试运行后,在我看来它需要 5*3^(n-2) 次调用 n >= 2,它的增长速度比 n! 慢得多。这个断言的证明留给读者作为练习。 :-)

      按照您的建议,记忆化版本需要 O(n) 次调用。

      顺便说一句,具有 n 个节点的二叉树的数量等于第 n 个Catalan number。 计算 Cn 的明显方法似乎都在 n 中是线性的,因此 countTrees 的记忆化实现可能是最好的方法。

      【讨论】:

        【解决方案3】:

        不确定记忆化版本会在查找表中命中多少次(这绝对是超线性的,并且会产生函数调用的开销),但数学证明产生的结果是相同的作为第 n 个加泰罗尼亚数,我们可以快速设计出一种线性时间表格法:

            int C=1;
            for (int i=1; i<=n; i++)
            {
                C = (2*(2*(i-1)+1)*C/((i-1)+2));
            }
            return C;
        

        注意记忆和制表的区别here

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-02-20
          • 2011-06-02
          • 2015-03-05
          • 1970-01-01
          • 1970-01-01
          • 2020-08-24
          • 1970-01-01
          相关资源
          最近更新 更多