确定性跳过列表自上而下插入中的违规

时间:2014-05-01 12:59:19

标签: data-structures skip-lists

假设我给出了一个跳过列表,订单为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 skip-list

如果我想通过自上而下的插入算法插入50,它会提升节点100的级别,然后才会陷入Head和{{1}之间的差距在150之前插入50。现在违规将发生,因为100100之间没有节点,而该间隙中应该至少有一个高度为150的节点为h-1

我做错了什么?

2 个答案:

答案 0 :(得分:2)

  

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

你为什么这样做?

根据您的链接我找到的确定性1-2跳过列表(this paper),可用(PDF)的第一个引用说:

  

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

     

更多   确切地说,我们在标题和级别开始搜索   1比跳过列表的高度高。当我们找到   我们将要下降的差距,我们看看水平   如果我们在一行中看到3个相同高度的节点,   我们提出中间的一个;之后我们下降了一个级别。   当我们达到底层时,我们只需插入一个新的   高度为1的节点。

根据这个,你应该从3级开始,看看下面的2级。这里一行中没有3个相同高度的节点 - 只有单个节点150 - 所以你不需要提高任何东西。现在,在差距中下降到第2级[HEAD,150]。

这是否开始解决您的困惑?

答案 1 :(得分:2)

  

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

它不会提高节点100的级别。相反,它会提高节点20的级别。根据算法,无论何时到达间隙中的maxlimit节点,都会提高节点的级别。该差距中的ceil((maxlimit/2))th节点。

在这种情况下,当节点20的级别升高到级别2时,头部和节点20之间没有级别1节点,但是它不会导致任何结构违规。 Munro等人在论文中描述的确定性跳过列表的原始结构。这样读。

  

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