【问题标题】:Implementing Skip List in C++在 C++ 中实现跳过列表
【发布时间】:2010-11-19 04:21:25
【问题描述】:

[已解决]

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

我很确定我很好地掌握了它的工作原理。当您插入 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,则值“升级”,如果为 0,则插入结束。这是不正确的吗?
  4. 如何存储类似于-infinite的值?

编辑:我已经开始编写一些代码,并且正在考虑如何处理 List 构造函数....我猜在它的构造上,“-infinite”值应该存储在 vectorname[0] 元素中我可以在它创建后调用 insert 将 x 放在适当的位置。

【问题讨论】:

    标签: c++ skip-lists


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。第二个链接特别有用(第一个链接的代码都被拆分了)
    【解决方案2】:
    1. 只需存储 2 个指针。在您的节点类中,一个在上面调用,一个在下面调用。
    2. 不明白你的意思。
    3. 根据wikipedia你也可以做几何分布。我不确定分发类型是否对完全随机访问很重要,但如果您知道自己的访问模式,这显然很重要。
    4. 我不确定您的意思。你可以用浮点数来表示类似的东西。

    【讨论】:

    • 对于2我的意思是如何处理实际的数据存储。我假设 List 应该有一个私有成员:vector numbers 保存插入的数字。对于 4,我猜它应该只是可能的最低整数值?
    • 对于 2,您需要存储指向要存储的内容的指针,例如 *char 或 *int 或 *MyClass 等...对于 4,无法使用常规整数来做到这一点,您必须实现自己的或使用浮点数。
    • 为什么它会包含一个向量?列表中的每个节点都应该存储一个整数。您可以将 std::numeric_limits::min() 用于 -infinity,但我建议将头节点设为特殊情况。
    • 是的,当我编写代码时,我意识到节点应该保存值而不是列表。我阅读了头节点和尾节点,我认为这就是我将如何实现它。
    【解决方案3】:

    你把“垂直”和“水平”弄得太复杂了。它们都只是指针。你在纸上画的带有线条的小盒子只是为了在思考它们时帮助想象一些东西。您可以将指针称为“大象”,如果您愿意,它会转到下一个节点。

    例如。 “next”和“prev”指针与“above”/“below”指针完全相同。

    不管怎样,祝你作业顺利。我曾经在我的数据结构课上做过同样的作业。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-18
      • 1970-01-01
      • 1970-01-01
      • 2011-10-15
      • 1970-01-01
      • 2012-10-02
      • 1970-01-01
      相关资源
      最近更新 更多