在C ++中实现Skip List

时间:2009-08-13 03:05:52

标签: c++ skip-lists

[解决]

所以我决定尝试创建一个排序的双向链接跳过列表...

我很确定我很清楚它是如何工作的。当您插入x时,程序会在基本列表中搜索放置x的适当位置(因为它已排序),(概念上)翻转一个硬币,如果“硬币”落在a上,那么该元素将被添加到上面的列表中(或者创建一个包含元素的新列表),链接到它下面的元素,再次翻转硬币,等等。如果“硬币”随时落在b上,则插入结束。您还必须在每个列表中存储-infinite作为起点,以便无法插入小于起点的值(意味着永远无法找到它。)

要搜索x,您可以从“左上角”(最高列表最低值)开始,然后“向右移动”到下一个元素。如果值小于x,则继续下一个元素等,直到“走得太远”并且值大于x。在这种情况下,您将返回到最后一个元素并向下移动一个级别,继续此链,直到找到x或x从未找到。

要删除x,您只需搜索x并在列表中每次出现时将其删除。

现在,我只想制作一个存储数字的跳过列表。我认为STL中没有任何东西可以帮助我,所以我需要创建一个包含整数值的类List,它具有成员函数,搜索,删除和插入。

我遇到的问题是处理链接。我很确定我可以用一个指向前一个元素和前面元素的指针来创建一个处理“水平”链接的类,但是我不知道如何处理“垂直”链接(指向相应的元素)在其他名单?)

如果我的逻辑存在任何缺陷,请告诉我,但我的主要问题是:

  1. 如何处理垂直链接以及我的链接想法是否正确
  2. 现在我读了我的类List的想法,我认为List应该包含一个整数向量而不是一个整数。事实上,我非常积极,但只想进行一些验证。
  3. 我假设硬币翻转只是调用int函数,其中rand()%2返回0或1的值,如果它为0,则值为“level up”,如果为0,则插入结束。这是不正确的?
  4. 如何存储类似于-infinite的值?
  5. 编辑:我已经开始编写一些代码并且正在考虑如何处理List构造函数....我猜测在构造时,“-infinite”值应该存储在vectorname [0]元素中我可以在创建后调用insert来将x放在适当的位置。

3 个答案:

答案 0 :(得分:2)

http://msdn.microsoft.com/en-us/library/ms379573(VS.80).aspx#datastructures20_4_topic4

http://igoro.com/archive/skip-lists-are-fascinating/

上面的跳转列表是用C#实现的,但可以使用该代码计算出c ++实现。

答案 1 :(得分:1)

  1. 只需存储2个指针。一个在上面调用,一个在你的节点类中调用。
  2. 不确定你的意思。
  3. 根据wikipedia,您还可以进行几何分布。我不确定发布的类型是否对完全随机访问很重要,但如果你知道你的访问模式,这显然很重要。
  4. 我不确定你的意思。你可以用浮点数表示类似的东西。

答案 2 :(得分:1)

你使“垂直”和“水平”过于复杂。它们都只是指针。你在纸上绘制的小盒子上的线条只是为了在想到它们时帮助想象一些东西。您可以调用指针“elephant”,如果您想要它,它将转到下一个节点。

例如。 “next”和“prev”指针与“上方”/“下方”指针完全相同。

无论如何,祝你的功课好运。我在数据结构课上做过一次相同的作业。