【问题标题】:Space/Time complexity of Binary Tree Equality二叉树等式的空间/时间复杂度
【发布时间】:2014-04-18 14:06:05
【问题描述】:

我昨天接受了一个采访,涉及一个非常基本的树数据结构:

t ::= int | (t * t)

其中一个 tTree 是一个整数(叶)或两个 t,它们代表左右子树。这意味着树将在叶级别具有值。

示例树可能如下所示:

         t 
      /     \ 
     t        t
   /   \    /   \
  1     2  3     4

任务是编写一个函数equal(t, t) => bool,它接受两个 tTree 并确定它们是否相等,非常简单。

我写了非常标准的代码,结果是这样的(下面是伪代码):

fun equal(a, b) {
   if a == b {   // same memory address
      return true
   } 

   if !a || !b { 
      return false
   }

   // both leaves 
   if isLeaf(a) && isLeaf(b) {
      return a == b 
   }

   // both tTrees
   if isTree(a) && isTree(b) {
      return equal(a->leftTree, b->leftTree) 
          && equal(a->rightTree, b->rightTree)
   }

   // otherwise
   return false
}

当被要求给出时间和空间复杂度时,我很快回答:

O(n) time 
O(1) space

我的面试官声称他们可以创建一棵树,这样这个相等的函数就可以在O(2^n) 指数时间内运行。鉴于上述算法,我没有(现在仍然没有)看到这是怎么可能的。我看到该函数递归调用自身两次,但是每次调用的输入大小都减半,对吗?因为您只是在并行检查各个子树。

对此的任何想法或意见都会非常有帮助。

【问题讨论】:

  • 出于好奇,他们为什么要编写一个极慢版本的函数?
  • ?我不确定我是否遵循。他们不希望我创建一个可以在指数时间内运行的算法,他们说我的上述算法在某些树的指数时间内运行。我不明白。
  • 哦,我明白了。然后误解了这些问题。
  • 你的n是叶子数,他们的n是分支层数
  • 我不明白,因为树在定义上是平衡的,所以他们可以改变的唯一变量是级别数。没有太多要“构建”的东西。据我所知,这基本上等于列表比较。

标签: algorithm complexity-theory


【解决方案1】:

就目前而言,你的代码是 O(n),你的面试官弄错了。虽然代码在空间使用方面不是 O(1):在最坏的情况下(当树非常不平衡时)它是 O(n),因为您的代码是递归的(而不是尾递归)。

可能他们要求您编写一个函数来测试两棵树是否同构。也就是说,他们希望您编写在比较这两棵树时返回 true 的代码:

  *      *
 / \    / \
1   2  2   1

然后他们误读了您的解决方案,假设您编写了执行此操作的简单代码,即 O(2^n)。

另一种可能性是,一些指针可以在同一棵树的左右分支中重复使用,从而允许在 O(n) 空间中表示具有 2^n 个节点的树。那么如果'n'是内存中结构的大小,而不是节点的数量,那么面试官的位置是正确的。这是这样一棵树:

  ___   ___   ___   ___   ___
 /   \ /   \ /   \ /   \ /   \
*     *     *     *     *     1
 \___/ \___/ \___/ \___/ \___/

根在左边,有32个叶子节点(全1)。

【讨论】:

  • 同构测试不就是(equal(a->leftTree, b->leftTree) && equal(a->rightTree, b->rightTree)) || (equal(a->leftTree, b->rightTree) && equal(a->rightTree, b->leftTree))吗?
  • @HunterMcMillen 是的,这将是 O(2^n)。
  • 谢谢,这很有帮助。
猜你喜欢
  • 2020-02-13
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
  • 2021-08-25
  • 1970-01-01
  • 2020-08-24
  • 1970-01-01
  • 2014-02-28
相关资源
最近更新 更多