【问题标题】:Cost of a Java method in a binary-search-tree二叉搜索树中 Java 方法的成本
【发布时间】:2016-03-13 19:50:30
【问题描述】:

我们有 Java 方法 rangeQuery_count(BSTNode,int,int)。给定 BST 的根 (keys int) 和区间 [a,b],此方法返回 BST 属于区间的键数。

static int rangeQuery_count(BSTNode v, int a, int b) { //a<=b
   if(v==null) return 0;
   if(v.key < a) return rangeQuery_count(v.right, a, b);
   else if(v.key > b) return rangeQuery_count(v.left, a, b);
   else return 1 + rangeQuery_count(v.right, a, b) + rangeQuery_count(v.left, a, b);
}

我必须根据 BST 的节点数 n 来确定算法成本的渐近估计。我刚刚开始研究这些主题,我想了解如何计算项目的成本。

【问题讨论】:

标签: java algorithm binary-search-tree


【解决方案1】:

首先要认识到,成本取决于输入参数的特定值,在您的情况下,它取决于例如搜索树中有多少节点落在区间内。这里所做的通常的简化假设是计算最坏的可能情况。在这种情况下,这将是树中的所有节点都位于区间内时。在这种情况下,只要 v 不为空,您将始终采用 else 的最后一个子句,您将访问树的每个节点一次,如果树中有 n 个节点,则成本将与 n 大致呈线性增长。

【讨论】:

  • 谢谢!请问,如何确定算法中对树进行的访问类型?
  • 不知道你说的访问是什么意思。如果您要对节点进行编号,我们可以讨论前序、后序和有序,但在这种情况下,您只需检查比较,对子节点进行递归调用,然后将节点的数量加起来当前节点。
  • 我指的是三种深度优先遍历:前序、中序和后序。在这种情况下,算法执行的方法是什么?
  • 我猜是后序,因为最终的总和是在从其子节点返回后在节点中计算的,但三者之间的区别只有在涉及标识特定时刻的编号序列时才真正清楚- 将序列号分配给节点的时刻。任何递归树搜索都会不可避免地进入一个节点,搜索它的子节点,然后退出该节点。要区分预购和后购,您需要知道您关心的是出口还是入口。
猜你喜欢
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 2014-03-26
  • 1970-01-01
相关资源
最近更新 更多