插入键值对后在搜索树中递增值

时间:2011-04-30 14:15:15

标签: list language-agnostic data-structures hash tree

我正在解决编程问题,并遇到了障碍。我试图想出一个数据结构来将任意整数映射到另一个整数。你可能倾向于说“哈希表!”或“搜索树!”,我实际上已经想到了这些(甚至尝试了一个脏实现)。但是,有一个问题!

每次我从映射中插入或删除一个值时,我还希望增加/减少(减去一个或某个任意偏移量)所有大于或等于插入/删除值的值。

这是一个例子。

假设我有两个整数列表,我将用于此映射中的键和值:

Keys: (1, 6, 18, 21, 24)  
Vals: (2, 1,  3,  0,  4)

现在,如果我添加一个键值对(7,1),我想增加大于或等于1的所有值,结果如下:

Keys: (1, 6, 7, 18, 21, 24)  
Vals: (3, 2, 1,  4,  0,  5)

然后如果我删除键值对(21,0),结果就是:

Keys: (1, 6, 7, 18, 24)  
Vals: (2, 1, 0,  3,  4)

这对于几个列表/数组以及每次插入/删除后的一些处理(即,遍历值并逐个更改它们)相当简单。

但是,我正在寻找一种更有效率的方法,也许无需遍历整个值列表并递增/递减它们。也许甚至通过延迟递增​​/递减直到请求了一个值(应该已经递增/递减)。

有什么想法?

1 个答案:

答案 0 :(得分:2)

我认为如果你需要通过某些键进行快速查找,并根据实际值修改结果,则需要两个数据结构:一个用于键,一个用于值。

key的数据结构将只是一个关联数组(将其实现为哈希表,自平衡树或跳过列表,无关紧要)从键到树中的节点的值

值的树将是一个自平衡的二叉搜索树(或跳过列表,请参阅下面的编辑)。树中的节点具有与它们关联的增量及其值。增量适用于大于或等于特定节点的所有节点,即它适用于自身以及其右子树中的所有节点。

插入值时,会增加所有节点的增量,使其大于或等于要插入的值。这会增加其值大于或等于您在整个树中插入的值的所有节点的实际值。删除类似,只需将增量替换为减量。

如果要读取值,可以使用基于键的结构在基于值的树中查找节点。然后爬到根(为此必须保留指向树中节点父节点的指针)并从节点累积delta,其值大于或等于您开始的节点中的值。

在进行重新平衡时,您必须小心,因为您必须重新计算某些节点的增量,但这不应该影响时间复杂度。

编辑:对于跳过列表,管理增量非常简单:当您要查找要插入的位置时,在链接列表中的每个节点中增加增量,并将其与大于或者等于你插入的值(这也意味着你要向下一级)。删除类似,只是您必须将已删除项目的任何增量移动到右侧。

当您想要计算某个节点的实际值时,请在当前项目中尽可能高地攀爬,在那里应用增量(一个项目可以在一个插入或删除的多个时间段上有多个增量,你总是有要使用最高级别的值,然后在链接列表中向左移动一个节点并重复该过程,直到到达最左边的项目。

您访问节点的方式也意味着链接列表必须双重链接。