最快的叶树搜索

时间:2016-03-07 20:07:23

标签: c++ tree

假设我有一个像这样的树实现(简化):

class Node 
{
public:
    std::string name;
    int attr_1;
    double attr_2;
    unsigned int nChildren;
    Node* Children;
}

如果我需要通过其属性或名称获取特定节点,我是否需要从根遍历每个子节点才能找到它?或者是否有更快的搜索算法,或更快/更好的树实现?比如说,我需要通过类和id属性找到一个节点,比如当我需要应用CSS规则时。

2 个答案:

答案 0 :(得分:1)

如果没有规则定义节点可以/不可以的位置,则必须扫描所有节点,直到找到匹配为止。

算法中没有神奇的猜测。

答案 1 :(得分:1)

在您当前的草稿中,我认为找到具有特定Nodenameid任何其他数据的class的唯一可能方法是遍历树查看每个节点。时间复杂度为 O(nNodes)

您可能对二进制搜索树感兴趣,它允许您在 O(log(nNodes))中进行搜索操作,这样更快!但是,在添加/删除节点时,它们需要一些额外的工作才能保持有效。同样重要的是保持树平衡,这是 O(log(nNodes))时间的主要要求。

修改1

我熟悉css语法。在树上实现以满足所有css要求是很复杂的。这里确实二元搜索树不能代表DOM树。 DOM树应该由Node表示,对其子节点的引用以及对其父节点的可能性。二叉搜索树可以存储对这些节点的引用,并且例如通过id成功地提供搜索查询。但是如果任何节点被删除/添加/ id改变,二进制搜索树应该做出相应的反应。