我有一棵树,节点数量从100到500,000不等。树中的每个节点都有一个唯一的id。由于树中存在大量节点,因此在解析树中以搜索其中的节点时计算量很大。所以我想实现一个索引数据结构,其中id和另一个指针指向节点,实现这个索引数据结构的最佳方法是什么,我认为使用数组做它,但它赢了& #39; t help,因为在执行之前未知节点数。
树中的节点数可能超过500K并且动态增加,树中的节点不依赖于唯一ID,该id用于区分其他节点,主要用于搜索节点在树上。
以下示例可能会给出关于树的粗略概念(但这不是实际场景,只是使用它来解释树)。
假设树正在描述车辆,根节点下的每个节点 分类车辆的类型,比方说两轮车,火车,四个 在这个节点下的轮车,卡车等可能会更进一步 基于制造,模型,引擎等其他标准的分类。 并且每个节点将具有很少的属性(如在xml中)。所以最后我们 将使用id来搜索节点是否存在,如果是这样的话 属性,在树上完成了多个其他功能, 搜索是其中之一,它消耗了大量的时间。
答案 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;
};