首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >索引树的最佳方法

索引树的最佳方法
EN

Stack Overflow用户
提问于 2015-02-24 04:10:34
回答 2查看 640关注 0票数 2

我有一棵树,节点数量从100到500,000多个不等。树中的每个节点都被赋予一个唯一的id。由于树中有大量的节点,解析到树中搜索节点的计算量很大。所以我想实现一个索引数据结构,它有一个id和另一个指向节点的指针,--这是实现这个索引数据结构的最好方法,我想用一个数组来实现它,但是它不会有帮助,因为在执行之前不知道节点的数量。

树中的节点数可能超过500 K,并且动态增加,树中的节点不依赖于唯一的id,该id用于与其他节点的区分,并主要用于搜索树中的节点。

下面的示例可能给出了关于树的粗略想法(但这不是实际的场景,只是使用它来解释树)。

假设树描述的是车辆,根节点下的每个节点对车辆的类型进行分类,假设在这个节点下有两轮车、列车、四轮车、卡车等,在此节点下可能会有基于其他标准的进一步分类,如make、model、engine等。而且每个节点都有很少的属性(如xml中的属性)。因此,在最后,我们将使用id来搜索节点是否存在,如果这样读取这些属性,那么树上还有多个其他函数,搜索就是其中之一,它花费了大量的时间。

EN

回答 2

Stack Overflow用户

发布于 2015-02-24 07:14:41

由于无法估计树节点的数目,所以可以使用另一个平衡搜索树,例如R树,将地址存储到您的树节点。

例如,定义平衡搜索树的节点结构如下:

代码语言:javascript
复制
struct rb_node
{
    int id;
    node *n; //pointer to your tree node
};

然后根据id建立一个均衡的搜索树。

每次向树插入节点时,也要向平衡树插入一个节点。然后,您可以使用id快速找到节点。

票数 0
EN

Stack Overflow用户

发布于 2015-02-24 12:50:48

对于我来说,有一个id字段,然后一个node指针字段,这听起来有点像hashmap (或者hashtable,或者什么东西)。

如果你不知道这是什么,你基本上有一个数组,它只能变大(以2的幂),填充节点。当您想要添加数据时,对键执行散列计算,在本例中是id字段。这给了你一些数字。然后你说number % size_of_array。这需要模块余数才能得到实际上在数组大小范围内的数组元素。假设数组大小为2的幂,则可以确保所有节点都已填满。

您还需要一些其他功能,您可以在某个地方了解它们。

现在,(或者假设您已经知道了hashmap),您使用id字段作为每个节点的,而每个节点的指针将是指向树节点的指针。这通常是相当快的,除非您有很多冲突,或者具有相同哈希的节点,尽管通常您不应该超过两三次重新哈希。

代码语言:javascript
复制
struct hashnode {
  void *key;  //This is the id field.
  void *value;  //This points to the tree node.
}

struct hashmap {
  uint32_t size;
  uint32_t used;

  hashnode *nodes;
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28688000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档