在skiplist中找到第k个元素 - 需要解释

时间:2018-05-01 19:13:48

标签: algorithm skip-lists

我们在大学里学习跳过列表,我们必须在跳转列表中找到第k个元素。我还没有在互联网上找到任何关于这个的东西,因为跳过列表并不是真正流行的数据结构。 W. Pugh在他的原始文章中写道:
每个元素x都有一个索引pos(x)。我们在不变量中使用此值但不存储它。标头的索引为零,第一个元素的索引为1,依此类推。与每个前向指针相关联的是该指针所经过的距离的测量值fDistance:
x→fDistance [i] = pos(x→forward [i]) - pos(x)。
请注意,1级指针所经过的距离始终为1,因此可以节省一些存储经济性,但代价是算法的复杂性略有增加。

SearchByPosition(list, k)
if k < 1 or k > size(list) then return bad-index
    x := list→header
    pos := 0
    -- loop invariant: pos = pos(x)
    for i := list→level downto 1 do
        while pos + x→fDistance[i] ≤ k do
            pos := pos + x→fDistance[i]
            x := x→forward[i]
return x→value

问题是,我仍然不知道这里发生了什么。如何在不存储元素的情况下知道元素的位置?如果我们不存储pos(x),我们如何计算fdistance?如果我们从跳过列表的最高级别开始,我们如何知道0级上的节点数(或1,最低的节点)我们跳过这种方式?

1 个答案:

答案 0 :(得分:2)

我将假设您指的是如何在跳过列表中找到k - 最小(或最大)元素。我认为这是一个相当标准的假设,否则你必须澄清你的意思。

我将在这个答案中引用维基百科上的GIF:https://en.wikipedia.org/wiki/Skip_list

enter image description here

假设您想要找到k = 5最小元素。

从最高级别(图中的4)开始。您从30NIL会跳过多少个元素? 6(我们也算30)。太多了。

走下一个级别。从30跳到50的人数是多少? 23040

因此,我们将问题从简化为k = 5 - 2 = 3的{​​{1}}开始,找到50最小元素。

3跳到50的人数是多少? NIL,这太多了。

走下一个级别。从4跳到50的人数是多少? 70。现在,从级别2上的3 - 2 = 1开始,找到70个最小元素。

2跳到70的人数是多少? NIL,太多了。

从级别2上的70901(本身)。所以答案是1

因此,您需要为每个级别的每个节点存储跳过的节点数,并使用该额外信息以获得有效的解决方案。这似乎是70在您的代码中的作用。