当前位置: 首页 > 知识库问答 >
问题:

在BST时间复杂度中查找sum=0的三元组,代码如下

岳飞航
2023-03-14

我编写了以下代码,用于在BST中查找相加为0的三元组。但很难确定时间复杂度。

find()方法的时间复杂度为O(logn)。isTriplet()的时间复杂度是O(n^2)吗?

bool find(Node* root, int target) {
  if (root == NULL)
      return false;

  if (root->data == target)
      return true;

  return (target < root->data) ?  find(root->left, target) :  find(root->right, target);
}

bool isTriplet(Node* root, Node* actualRoot) {
  if (root == NULL)
     return false;

  if (root->left == NULL && root->right == NULL)
      return false;

  int sum = root->data;
  if (root->left)
      sum += root->left->data;
  else if (root->right)
      sum += root->right->data;

  sum = -1 * sum;

  return (find(actualRoot, sum) || isTriplet(root->left, actualRoot) || isTriplet(root->right, actualRoot));
}

共有1个答案

杨昆
2023-03-14

sum=0的三元组表示一个节点、一个左子级和一个右子级,三个元素的和等于0。

让我们逻辑思考。从树根开始,我们应该在哪里寻找这样的三胞胎?基本上,如果根是正的,则向左,如果根是负的,则向右。

我们应该什么时候检查是否发现这样的三联体?在三个数字中至少有一个负数和一个正数的情况下。0是一个特例,我将单独处理。

如果找到这样一个和,那么我们应该返回它并停止算法。因此,如果节点不是0,并且没有三元组,那么我们知道要在哪个子树中搜索。如果它是一个三元组,那么我们有一个简单的情况,因为找到了解。如果当前节点为0,则应检查其三元组是否为0。如果不是,那么我们可以停止搜索,因为任何子树都不会包含正数和负数。例外情况是,当前节点为0,而其一个子节点也正好为0。在这种情况下,我们还需要检查该子树。

对于最坏情况,算法的对数复杂度应为基数2。证明:

>

如果还没有找到这样的三元组,并且当前节点不是0,那么我们有一个有趣的子树和一个不有趣的子树。

如果尚未找到此类三元组,且当前节点为0,则:

3.1。它的两个孩子都是0,我们发现了这样一个三胞胎,

3.2. 它的子元素都不是0,因此可以证明不存在这样的三元组,或者

3.3.它的一个子级是0,但另一个不是,在这种情况下,0个子级定义了有趣的子树,另一个子级对非有趣的子树进行deinfes。

由于所有情况要么由于html" target="_blank">解决方案的存在或不存在而导致算法停止,要么将树减半为有趣和非有趣的子树,因此算法在每个级别上遍历单个节点最多,因此其在最坏情况下的复杂性等于树的高度,这是二进制对数。

 类似资料:
  • 假设T是具有n个节点和高度h的二叉查找树。T的每个节点x存储一个实数x。键。给出以下算法Func1(T. root)的最坏情况时间复杂度。你需要证明你的答案。 x.left() 对于最坏情况下的运行时,我认为这将是O(树的高度),因为这基本上类似于最小()或最大()二元搜索树算法。然而,它是递归的,所以我对是否将O(h)作为最坏的运行时编写有点犹豫。 当我考虑它时,最坏的情况是如果函数执行if(s

  • 给定一个高度为h的二叉查找树(BST),它需要O(k h)时间来连续应用BST Inorder后续算法k次,从任何节点开始,在先前调用返回的节点上应用每个下一个调用。 伪代码: 我如何证明这种时间复杂性? 特别是,我试图建立k和访问的节点数之间的关系,但在这里找不到任何模式。

  • 有人能帮我了解一下这个代码片段的时间和空间复杂性吗?请参考leetcode问题-单词中断II。给定一个非空字符串s和一个包含非空单词列表的字典单词dict,在s中添加空格来构造一个句子,其中每个单词都是有效的字典单词。返回所有这些可能的句子。

  • 下面给出了问题陈述和解决方案。我无法理解解决方案背后的逻辑。 问题陈述: 给定一个数组包含n+1个整数,其中每个整数介于1和n之间,证明至少存在一个重复的数字。假设只有一个重复的数字,找到重复的一个。 首先,搜索空间是1到n之间的数字。每次我选择一个数字mid(它是中间的那个),并计算所有等于或小于mid的数字。如果计数大于mid,则搜索空间为[1 mid],否则为[mid+1n]。我这样做,直到

  • 我正在尝试分析一个算法的时间复杂度。 下面的算法旨在只检查数组的一部分,所以如果它没有多大意义,请不要担心。 我对计算循环周围的时间复杂度很困惑,请看看我的评论。 这是否意味着我们有: T(N) = (C2 C4 C5)N (C1 C3 C6) T(N) = C7*N (C8) T(N)=N?? 循环中的所有内容都是*N? 先谢谢!