我搜索了一下,但没有找到这个问题的答案..
我构建了一个非二叉树,所以每个节点可以有任意数量的子节点(我认为称为n-ary树)
为了帮助搜索,我在构建树时给每个节点一个数字,这样每个节点的子节点都会更大,并且它右边的所有节点也会更大。
类似的东西:
这样我就可以获得搜索的登录时间
当我想插入节点时出现问题。如果我想在除结尾之外的任何地方插入节点,则该模型将不起作用。
我想到了几种方法,
将新节点插入所需位置,然后更新“后面”所有节点的数量。
使用数字数组而不是使用单个数字来表示每个节点。数组中的数字将表示其在特定级别上的位置。例如,节点1将为{0}。节点9将是{0,2}。节点7将是{0,0,1,2}。现在插入时,我只需要更改该级别的数字。
忘记所有编号,只比较每个节点,直到找到正确的编号。插入也不需要关心数字。
我的问题是,哪种方式会更好?我不确定使用整数数组来表示每个节点是非常快的..也许它仍然比第一种方式更快?还有其他方法可以解决这个问题吗?
提前谢谢。
答案 0 :(得分:2)
我认为你遇到的问题是为每个节点分配一个唯一的标识符,这样你就可以在次线性时间内找到给定其唯一id的节点。
这对于瞬态(内存中)数据结构通常不是问题,因为典型的树实现从不在内存中移动节点(直到它被删除)。这使您可以使用节点的地址作为唯一标识符,该标识符提供O(1)访问。 C之外的语言将它装扮成树状迭代器或节点引用之类的对象,但在引擎盖下原则是相同的。
但是,有时您确实需要能够将一个固定的所有时间标识符附加到树节点,以一种可以抵御的方式,例如,将树持久化为永久存储和然后将其重新序列化为不同的可执行映像。
一个众所周知的黑客就是使用浮点 ID。插入新节点时,其id被指定为其直接邻居的平均值。出于此计算的目的,我们假设树的左侧有一个节点,其中id 0.0 ,右侧的节点有id 1.0 ,因此每个节点有两个邻居,即使它是新的左或最多节点。特别是,根节点的id为 0.5 ,它是 0.0 和 1.0 虚边界点的平均值。
不幸的是,浮点精度不是无限的,如果插入始终位于树中的随机位置,则此hack效果最佳。如果在末尾插入所有节点,则会快速耗尽浮点精度。您可以定期对所有节点重新编号,但这会使具有永久不变的唯一节点ID的目的失效。 (对于某些问题域,它是可以接受的。)
当然,你真的不必使用浮点数。标准体系结构上的双精度具有53位精度,如果您的插入是随机的,那么就足够了,如果您总是插入相同的位置,则很少;通过(概念上)在高位之前定位固定的二进制点,可以使用无符号64位整数的所有64位。平均计算的工作原理相同,只是需要特殊情况下使用 1.0 值进行计算。
这与使用索引向量标记节点的想法基本相同。该方案具有永不耗尽精度的优点,以及矢量可以变得很长的缺点。您也可以使用混合解决方案,只有在当前级别的精度不足时才开始新级别。