有一种叫做 treap 的数据结构:这是一个随机二叉搜索树,它也是随机生成的所谓“优先级”的堆。
这种结构有一个变体,其中键是隐式的,它们不存储在树中,但我们将树中节点的有序索引视为该节点的键。我们需要在每个节点中存储子树的大小而不是键。这种技术使我们能够将treap视为某种数组,它支持在O(log N)时间内进行大量操作:插入、删除、子数组的反转、间隔变化等等。
我对这个结构有点了解,但没有那么多。我试图用谷歌搜索它,但我发现只有很多关于trap本身的文章,但没有关于这个“隐式treap”/“索引列表”的文章。我什至不知道它的名字,因为我的母语不是英语,而且我听的讲座使用的是母语结构术语,而不是英文原词。这个原生术语可以直接用英文翻译为“隐式键上的Treap”或“隐式键上的笛卡尔树”。
谁能指出关于这个结构的文章或告诉我它的原名?谢谢你。
PS对不起,如果我的英语不够理解。
UPD:关于我正在寻找的结构的一些额外解释。
考虑一个具有随机选择的优先级和键的常见trap,它们是存储在树中的实际用户数据。然后让我们假设我们在每个节点中存储了一些其他用户信息,并且键只是搜索键。下一步是计算和维护每个节点中的子树大小:我们必须在每次 Merge/Split/Add/Remove 之后更新此参数,但它允许我们在 O(log N) 中找到树的第 K 个元素时间。
当我们在每个节点中都有子树大小时,我们可以扔掉键并想象 treap 表示按顺序遍历的用户数据数组。每个元素的数组索引可以很容易地从子树大小计算出来。现在我们可以在数组中间添加/删除一个元素或拆分这个数组——所有这些都在 O(log N) 时间内。
我们还可以进行“多重”操作——例如,为我们的“数组”的所有元素添加一个常量值。为了实现这一点,我们必须使这个操作延迟,在每个节点中添加一个参数,表示一个延迟常量,该常量必须“稍后”添加到该节点子数组的所有元素,并将更改“推”到下为必要的。向子数组添加一个常量或绘制(标记)子数组可以通过这种方式延迟,如反转子数组(这里节点中的延迟信息在位“子数组必须被反转”)等等。
UPD2:这是代码片段- 我发现的少量信息。不要注意西里尔字母 :) 单词“с неявным ключом”在直接翻译中的意思是“带有隐式键”。