5

[解决了]

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

我很确定我很好地掌握了它的工作原理。当您插入 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 放在适当的位置。

4

3 回答 3

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++ 实现。

于 2009-08-13T03:24:59.760 回答
1
  1. 只需存储 2 个指针。在您的节点类中,一个在上面调用,一个在下面调用。
  2. 不明白你的意思。
  3. 根据维基百科,您还可以进行几何分布。我不确定分布类型是否对完全随机访问很重要,但如果你知道你的访问模式显然很重要。
  4. 我不确定你的意思是什么。你可以用浮点数来表示类似的东西。
于 2009-08-13T03:19:17.633 回答
1

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

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

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

于 2009-08-13T03:25:17.730 回答