[英]Binary Search Tree Performance fail on large trees
我一直在寻找类似的情况,但似乎找不到。
这是我需要做的:
编写一个函数,检查给定的二进制搜索树是否包含给定的值。
例如,对于以下树:
- n1(值:1,左:null,右:null)
- n2(值:2,左:n1,右:n3)
- n3(值:3,左:null,右:null)
调用contains(n2,3)应该返回true,因为根为n2的树包含数字3。
这是我的代码:
class Node {
public int value;
public Node left, right;
public Node(int value, Node left, Node right) {
this.value = value;
this.left = left;
this.right = right;
}
}
public class BinarySearchTree {
public static boolean contains(Node root, int value) {
if(value == root.value)
return true;
if(root.left != null && contains(root.left, value))
return true;
if(root.right != null && contains(root.right, value))
return true;
return false;
}
public static void main(String[] args) {
Node n1 = new Node(1, null, null);
Node n3 = new Node(3, null, null);
Node n2 = new Node(2, n1, n3);
System.out.println(contains(n2, 3));
}
}
但是,它在最后一个测试中一直失败:
一棵大树上的性能测试:超过时间限制
请如果有人对如何优化我的流程有所了解,那将是很大的帮助。 我实际上快要疯了:(
问题是您不将此树用作二进制搜索树。 您检查左和右分支。
“二进制搜索树”另外满足二进制搜索属性,该属性指出每个节点中的键必须大于或等于左子树中存储的任何键,并且小于或等于右子树中存储的任何键-树。”
这意味着您只需要检查分支之一。
如果同时检查了两者,那么专门构造的测试用例可能会使您的搜索花费很长时间。 您将基本上遍历整个树。
使用二进制搜索树的性能增益来自将值分成更大或更小的结果。 因此,您需要检查该值是否小于节点中当前的值,如果是,请查看树的左侧,否则,您将全部查看,直到找到搜索到的值。
看一下具有许多元素(假设为100)的Array。 当您搜索第70个值时,您将必须进行70次检查if(foundValue == searchedValue)
。
现在,对树进行相同操作。 您的起始节点持有值50,75更大,因此您查看树中的子集51-100。 在这里,您遇到的第一个节点是75,因此您看一下子集51-74,依此类推。
我要感谢lexicore和ivo-vidovic给我关于Binary Search Tree的更实际的解释。 如果我有足够的声誉,我将对您的两个职位都投赞成票。 非常感谢你。
附带说明一下,这是我对性能测试问题的反对意见:
if(value <= root.value) {
if (root.left != null && contains(root.left, value))
return true;
} else if (value >= root.value) {
if (root.right != null && contains(root.right, value))
return true;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.