Data structures 确定性跳过列表自上而下插入中的冲突

Data structures 确定性跳过列表自上而下插入中的冲突,data-structures,skip-lists,Data Structures,Skip Lists,假设给我一个跳过列表,顺序为3 HEAD level 3 |--------------------------------------------> X | |---| level 2 | -------------------> | | ----------------> X | |---| |---| |---| |-

假设给我一个跳过列表,顺序为3

           HEAD
level 3     |--------------------------------------------> X
            |                      |---|
level 2     | -------------------> |   | ----------------> X
            |    |---|    |---|    |---|    |---|
level 1     | -> |   | -> |   | -> |   | -> |   | -------> X
            |    |---|    |---|    |---|    |---|
            |    | 20|    |100|    |150|    |200|
            |    |---|    |---|    |---|    |---|


minlimit = ceil(order/2) - 1 = 1

maxlimit = order - 1 = 2
所以本质上它是一个
1-2跳过列表

如果我想通过自上而下的插入算法插入
50
,它将提高节点
100
的级别,然后进入
150
之间的间隙,并在
100
之前插入
50
。现在将发生冲突,因为
100
150
之间没有节点,而该间隙中至少应有一个高度
h-1
的节点,因为
minlimit=1

我做错了什么

如果我想通过自上而下的插入算法插入50,它将在节点100的级别下降到Head和150之间的间隙之前提高节点100的级别,并在100之前插入50

你为什么这么做

我找到的关于确定性1-2跳过列表()的第一个参考,根据您的链接提供(),上面说:

如[…]中所述,在。。。可以 自上而下执行。。。采纳这个 在这种方法中,我们在1-2-3跳过列表中插入一个元素 将大小为3的任何间隙拆分为大小为1的两个间隙,如果 正在搜索要插入的元素。我们保证 这样,结构在插入或不插入元素的情况下保持间隙不变

更 准确地说,我们从页眉开始搜索,并在 1高于跳过列表的高度。当我们发现 我们将要缩小的差距,我们看水平 下面,如果我们在一行中看到3个高度相同的节点, 我们提出中间的一个;之后,我们降低了一个级别。 当我们到达最底层时,我们只需插入一个新的 高度为1的节点

根据这一点,您应该从级别3开始,然后查看下面的级别2。这里一行中没有3个相同高度的节点-只有一个节点150-因此不需要提升任何内容。现在,在间隙中下降到2级[头部,150]

这开始解决你的困惑了吗

如果我想通过自上而下的插入算法插入50,它将在节点100的级别下降到Head和150之间的间隙之前提高节点100的级别,并在100之前插入50

它不会提升节点100的级别。相反,它将提高节点20的级别。根据该算法,每当您达到间隙中节点的
maxlimit
时,您就会提高该间隙中节点的
ceil((maxlimit/2))的级别

在本例中,当节点20的级别提升到级别2时,头部和节点20之间没有级别1节点,但不会导致任何结构冲突。Munro等人在论文中描述的确定性跳过列表的原始结构是这样理解的

假设在n个元素的跳过列表中,存在高度1高于跳过列表高度的第0个和第(n+1)个节点,我们要求在高度h(h>1)或更高的任意两个节点之间,存在高度h–1的1或2个节点


我们能看看你的代码吗?代码正是我上面所说的。我认为代码是无关的,因为问题是关于算法,而不是它的实现,我只是想知道我在这个特定场景中所做的步骤是否正确。但是如果你认为它很重要,我可以把它贴在这里。谢谢你的回复。我知道可以这样做,但问题是我必须使用自上而下插入来完成,在自上而下插入中,如果目标级别的节点数等于中提到的“maxlimit”,则向下时,中间节点的级别会增加。这样做的目的是提高插入的效率。我不明白为什么会发生这种异常,因为自顶向下的插入算法非常有名,并且经过测试,它应该可以正常工作。也许我做错了什么,但我想不出来。你把1-2-3斯基普利斯特和1-2斯基普利斯特搞混了。引起故障的是1-2 skiplist,1-2-3按照本文中的步骤工作就可以了。正如您所提到的,当从3级下降到2级时,不需要做任何事情,因为2级只有一个节点(150),但是当我们从2级下降到1级时,中间的节点必须升高,因为在1-2 skiplist中,maxlimit是2(而不是像1-2-3 skiplist那样的3),并且间隙中已经有2个节点[Head,150]因此节点100的级别将提高。无论您选择第ceil(maxlimit/2)个元素还是第(floor(maxlimit/2)+1)个元素都没有关系,因为在节点数为偶数的情况下,没有中间节点。这与您刚才引用的语句相矛盾。该语句指出:“存在1个或2个高度为h-1的节点”但是你说在高度h-1有0个节点,这很好,这很荒谬。如果你仍然有疑问,那么为这个skiplist创建相应的2-3树(插入50个之后)你会发现树的所有叶节点都不在同一水平。是的,这正是与你的说法相矛盾的地方。当节点20升高到h>1时,它的高度为2,在h-1水平,即1,在我们的例子中,头部和节点20之间应该有1或2个高度为1的节点,但没有一个节点明显违反结构l约束。自上而下算法适用于具有偶数和奇数度的B-树,如果您认为您是正确的,请提供参考。其中还指出“1-2跳过列表和2-3树之间存在一对一的对应关系”(本例中的顺序为3,显然是奇数,但存在对应关系)也给出了相关的例子。请尽量理解这句话,保持礼貌。因此不要鼓励敌对态度。这句话说在两个高度为h的节点之间;两个节点将处于相同的高度h。如果两个节点不同,它将处于高度h和h。我已经找到了答案,我不确定是否正确ect也有,但有很好的机会。