我们在大学里学习跳过列表,我们必须在跳转列表中找到第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,最低的节点)我们跳过这种方式?
答案 0 :(得分:2)
我将假设您指的是如何在跳过列表中找到k
- 最小(或最大)元素。我认为这是一个相当标准的假设,否则你必须澄清你的意思。
我将在这个答案中引用维基百科上的GIF:https://en.wikipedia.org/wiki/Skip_list
假设您想要找到k = 5
最小元素。
从最高级别(图中的4)开始。您从30
到NIL
会跳过多少个元素? 6
(我们也算30
)。太多了。
走下一个级别。从30
跳到50
的人数是多少? 2
:30
和40
。
因此,我们将问题从简化为k = 5 - 2 = 3
的{{1}}开始,找到50
最小元素。
从3
跳到50
的人数是多少? NIL
,这太多了。
走下一个级别。从4
跳到50
的人数是多少? 70
。现在,从级别2
上的3 - 2 = 1
开始,找到70
个最小元素。
从2
跳到70
的人数是多少? NIL
,太多了。
从级别2
上的70
到90
? 1
(本身)。所以答案是1
。
因此,您需要为每个级别的每个节点存储跳过的节点数,并使用该额外信息以获得有效的解决方案。这似乎是70
在您的代码中的作用。