索引树的最佳方法

时间:2015-02-24 04:10:34

标签: c data-structures

我有一棵树,节点数量从100到500,000不等。树中的每个节点都有一个唯一的id。由于树中存在大量节点,因此在解析树中以搜索其中的节点时计算量很大。所以我想实现一个索引数据结构,其中id和另一个指针指向节点,实现这个索引数据结构的最佳方法是什么,我认为使用数组做它,但它赢了& #39; t help,因为在执行之前未知节点数。

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

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

  

假设树正在描述车辆,根节点下的每个节点   分类车辆的类型,比方说两轮车,火车,四个   在这个节点下的轮车,卡车等可能会更进一步   基于制造,模型,引擎等其他标准的分类。   并且每个节点将具有很少的属性(如在xml中)。所以最后我们   将使用id来搜索节点是否存在,如果是这样的话   属性,在树上完成了多个其他功能,   搜索是其中之一,它消耗了大量的时间。

2 个答案:

答案 0 :(得分:0)

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

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

struct rb_node
{
    int id;
    node *n; //pointer to your tree node
};

然后根据id构建平衡搜索树。

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

答案 1 :(得分:0)

你所说的有一个id字段,然后一个node指针字段与我相关的声音就像 hashmap (或哈希表< / strong>,或者你有什么。)

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

您还需要其他许多功能,您可以在某处阅读它们。

现在,(或假设您已经了解了哈希映射),您使用id字段作为每个节点的,并使用每个节点的指针node将是指向树节点的指针。这通常相当快,除非您有大量的冲突或具有相同哈希的节点,但通常情况下,您不必重复两次或三次以上。

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;
};