有一个称为treap的数据结构:这是一个随机的二进制搜索树,它也是随机生成的所谓“优先级”的堆。
这种结构有一个变体,其中的键是隐式的,它们不存储在树中,但是我们将树中节点的有序索引视为该节点的键。我们需要在每个节点中存储子树的大小,而不是密钥。这种技术使我们能够像某种数组一样思考treap,它在O(log N)时间内支持很多操作:插入,删除,子数组的还原,间隔的改变等等。
我对这种结构有些了解,但了解的不多。我试图用谷歌搜索它,但是我只发现了很多有关诱捕本身的文章,但是没有关于“隐式诱捕” /“索引列表”的任何文章。我什至不知道它的名字,因为我的母语不是英语,而且我听过的演讲使用的是结构性母语,而不是英语原文。该本地术语可以直接翻译为英语:“在隐式键上进行捕捉”或“在隐式键上进行笛卡尔树”。
谁能指出我有关该结构的文章,或告诉我它的原始名称?谢谢。
PS对不起,如果我的英语听不懂。
UPD: 关于我正在寻找的结构的一些额外说明。
考虑具有随机选择的优先级和键的通常的挖掘,这是存储在树中的实际用户数据。然后假设我们在每个节点中存储了一些其他用户信息,而键只不过是搜索键。下一步是计算并维护每个节点中子树的大小:每次合并/拆分/添加/删除之后,我们都必须更新此参数,但是它允许我们在O(log N)中找到树的第K个元素。时间。
当每个节点都有子树大小时,我们可以扔掉键并想象一下,treap代表顺序遍历的用户数据数组。每个元素的数组索引可以很容易地从子树大小中计算出来。现在我们可以在数组中间添加/删除元素或拆分该数组- 全部在O(log N)时间内进行。
我们还可以进行“多个”操作- 例如,将常量值添加到“数组”的所有元素中。为了实现这一点,我们必须延迟此操作,在每个节点中添加一个代表延迟常量的参数,该参数必须“稍后”添加到该节点子数组的所有元素中,然后将更改“推”到向下必要。向子数组添加常量或绘画(标记)子数组可以通过这种方式来延迟,例如反转子数组(此处“子数组必须反转”节点中的延迟信息),依此类推。
UPD2: 这是代码段 -我发现的少量信息中的一部分。不要注意到西里尔字母:)单词“снеявнымключом”的意思是直接翻译“带隐含键”。
您可以在Kaplan和Verbin的论文中找到有关此数据结构的信息,该论文通过逆向对有符号排列进行排序(第3.1页的第7页):http : //www.math.jussieu.fr/~fouquet/ENSEIGNEMENT/PROJETS/kaplan.pdf。