【问题标题】:Is it possible to compare two binary trees in less than O(n log n) time?是否可以在少于 O(n log n) 的时间内比较两棵二叉树?
【发布时间】:2023-03-20 05:55:01
【问题描述】:

我编写了一个 java 例程来比较 2 个二叉树。我正在寻找运行时间更短的更好算法。

 public class TreeNode {
  int val;
  TreeNode left;
  TreeNode right;
  TreeNode(int x) { val = x; }
 }

 class Solution {
  public boolean isSameTree(TreeNode p, TreeNode q) {

    if  ( p == null && q==null)
        return true;

    if (p == null || q == null) 
        return false;

    if ( (p.val == q.val) && isSameTree(p.left, q.left) && 
      isSameTree(p.right, q.right))
        return true;
    else 
        return false;  
   }   
  }

我的代码需要 O(n log n) 时间。

如何减少所需时间?

【问题讨论】:

  • 如果你碰巧在结构的底部有一个size 变量,请先进行比较。
  • 不要写,永远不要出现未注释的代码。永远不要编码if (condition) return true; else return false;。只需// same tree if same root, left, and right return p == q || null != p && null != q && p.val == q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
  • 你算什么n?您的算法在节点数上看起来非常线性。

标签: java algorithm time-complexity binary-tree


【解决方案1】:

您方法的当前运行时间实际上是O(n),其中n 应该是具有较少(或如果它们相等)节点的树的节点数。

另外,请注意比较数据结构的所有值您必须访问所有这些值,这是您可以实现的运行时,并且不会进一步减少。在当前情况下,最坏的情况是,您将不得不访问较小树的所有节点,因此访问 O(n)

因此,尽管任何其他方法都可以帮助您进行条件优化,但您当前的解决方案具有无法进一步减少的最佳运行时间。

【讨论】:

  • 事实上......这是 O(n) 最坏情况。最好的情况是 O(1)。
  • @StephenC big-O 表示法意味着“最坏情况”。
  • 并非总是如此。例如,我们不会说HashMap 插入是O(N)!按照惯例,如果您没有限定,大 O 指的是“平均”或“典型”情况。问题在于,对于 OP 的示例,很难说出平均值是多少。这就是为什么一个好主意明确,而不是依靠一些模糊的约定来解释我们的意思,
  • 严格来说,大O的意思是“上限”。您可以谈论最坏情况的上限和下限(对于某些算法,n 的不同范围可能有不同的最坏情况)或最佳、平均等情况的上限和下限。
  • 通俗地说,我们用“worst case O(n)”表示“最坏情况的上限”,“average case O(n)”表示“平均情况的紧密 (theta) 界限" 因为这些是最有用的指标。​​
猜你喜欢
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 2021-03-07
  • 1970-01-01
相关资源
最近更新 更多