最优树数据结构

时间:2013-09-28 17:05:21

标签: c# algorithm tree

我的树有很多节点(数百万+),需要加载到内存中。因此,我需要最有效的方法来存储节点及其在内存中的关系。那个最好的数据结构是什么?到目前为止,我有两个选择:

//more obvious but the less efficient
class TreeNode
{
 Node parent;
 TreeNode[] children;

 //additional fields
 byte X;
 byte Y;
 byte marker;
 string comment;
}

//more efficient
class TreeNode
{
 TreeNode next; //reference to the next child of parent node,
                //if isLast=true - reference to parent node

 TreeNode firstChild; //reference to the first child of this node

 bool isLast; //true, if this node is the last parents child

 //additional fields
 byte X;
 byte Y;
 byte marker;
 string comment;
}

请注意,我需要在此树上执行​​此类操作,如浏览,删除和插入,我需要这些操作足够快。

编辑:这种情况的最佳选择是使用较少的RAM来存储整棵树。第二个标准是快速删除,浏览和插入操作 - 在上面我写的数据结构中,它们不应该花费更多的时间。我无法制定更严格的标准

2 个答案:

答案 0 :(得分:0)

听起来你有一个变异的,内存中的数据集。如果是这样,那么了解哪些操作是常见的将是非常重要的。例如,当您提到“浏览”时,是搜索,还是从您当前正在查看的节点对父母或子女进行简单遍历?

如果是搜索,如果这通常是第一个操作(即您找到一个带有值的节点,然后您对其执行某些操作),那么您可以考虑使用Red/Black Tree。此结构需要记录搜索,插入和删除的时间。插入和删除期间强加的规则使树优化以便进行搜索。

如果搜索速度不重要,那么您可以使用更简单的树结构加快插入和删除。

就你的太空而言,红/黑树,就像几乎所有其他树结构一样,需要n个空间。这与结构本身一样好。但请记住,因为你可以采取创造性的措施。

例如,您在每个节点中存储3个字节和一个字符串。您是否可以仅将此数据的一部分存储在内存中,并根据需要从持久存储(例如数据库)中查找其余数据?它必须是标准树操作不必要的数据,但也许它是可行的。或者,是否可以在内存中压缩字符串数据?

答案 1 :(得分:0)

我已经有很长一段时间了,因为我直接使用C ++类型的结构,但是当我这样做时,我正在使用btree结构。前提是类似的,但在单个节点上,每个级别可以说... 8(或更多)键。但如果您正在处理数百万条目,可能需要考虑一下?

前提是在顶级节点上说你有8个密钥......为了简单地理解一个90k条目的树,顶级节点是10k,20k,30k ...... 80k。因此,如果您要查找的数字小于10k,它会下降它的腿...不到20k下降它的腿等等。因此,通过在单个节点级别测试一些可用的元素,您基本上可以抛弃其他80k。

所以,举个例子,你正在寻找26,895。它从顶级节点开始,获得你想要的30k(小于30k,但超过20k)。现在加载下一个节点。但是这个节点跨越20,001到29,999。对于笑脸,它的主要突破是21250,22500,23750,2500,26250,27500,28750,29999。(每个突破1250)。所以现在你达到27500你不到,它再深一层。这个级别现在跨越26250到27499的差距,而你只是第二级。

你显然需要一本书或更强的参考来完成,但是btree可以非常强大和快速。

相关问题