繁体   English   中英

大型树上的二进制搜索树性能失败

[英]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,依此类推。

我要感谢lexicoreivo-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM