在C++中实现跳表

5
[SOLVED]
所以我决定尝试创建一个排序的双向跳表...
我相信我已经很好地掌握了它的工作原理。当你插入x时,程序会在基本列表中搜索适当的位置放置x(因为它是排序的),(概念上)抛硬币,如果“硬币”落在a上,则将该元素添加到其上方的列表中(或创建一个新列表并将元素链接到其下方),然后再次翻转硬币等。如果任何时候“硬币”落在b上,则插入结束。您还必须在每个列表中存储一个负无穷大作为起始点,以便不可能插入小于起始点的值(这意味着永远找不到)。
要查找x,您从“左上角”(最高列表最低值)开始,并“向右移动”到下一个元素。如果值小于x,则继续到下一个元素,等等,直到您“走得太远”,而值大于x。在这种情况下,您返回到最后一个元素并向下移动一个级别,继续这个链,直到您找到x或x永远不会被找到。
要删除x,只需搜索x并在列表中每次出现时将其删除。
目前,我只打算制作一个存储数字的跳表。我认为STL中没有任何可以帮助我的东西,所以我需要创建一个包含整数值并具有成员函数search、delete和insert的List类。
我遇到的问题是如何处理链接。我相信我可以创建一个处理“水平”链接的类,其中包含指向前一个元素和前面的元素的指针,但我不确定如何处理“垂直”链接(指向其他列表中对应的元素?)
如果我的逻辑有误,请告诉我,但我的主要问题是:
1. 如何处理垂直链接以及我的链接想法是否正确 2. 现在我读了一下我的List类的想法,我认为一个List应该保存一个整数向量而不是单个整数。事实上,我非常肯定,但只是想得到一些验证。 3. 我假设抛硬币会简单地调用int函数,其中rand()%2返回0或1的值,如果它是0,则值“级别提升”,如果它是0,则插入结束。这是不正确的吗? 4. 如何存储类似于负无穷大的值?
编辑:我已经开始编写一些代码,并考虑如何处理List构造函数...我猜测在其构造时,“负无穷大”值应存储在vectorname [0]元素中,并且我可以在创建后调用insert将x放在适当的位置。
3个回答

2

谢谢。第二个链接特别有帮助(第一个链接的代码都分散了)。 - trikker

1
  1. 在你的节点类中,只需存储2个指针。一个称为above,另一个称为below。
  2. 我不确定你的意思是什么。
  3. 根据wikipedia,您还可以进行几何分布。如果您知道访问模式,则分布类型显然很重要,但对于完全随机访问,分布类型是否重要我不确定。
  4. 我不确定您的意思是什么。您可以使用浮点数表示类似的内容。

对于第二个问题,我的意思是如何处理实际的数据存储。我假设List应该有一个私有成员:vector<int> numbers,它保存插入的数字。对于第四个问题,我猜它应该只是最低可能的整数值? - trikker
对于第二点,你需要存储一个指向你想要存储的内容的指针,例如 char、int 或 *MyClass 等。对于第四点,使用普通整数无法实现,你必须自己实现或使用浮点数。 - Unknown
为什么它会包含一个向量?列表中的每个节点都应存储一个整数。您可以使用std::numeric_limits<int>::min()表示负无穷,但我建议将头节点作为特殊情况。 - Geerad
是的,当我在编写代码时,我意识到节点应该保存值而不是列表。我阅读了关于头节点和尾节点的资料,我认为这就是我要实现的方式。 - trikker

1
你把“垂直”和“水平”想复杂了。它们仅仅是指针而已。当你思考的时候,在纸上画一些有线条的小方块只是为了帮助你可视化某些东西。如果你愿意,你可以称指针为“大象”,它也会去到下一个节点。
例如,“next”和“prev”指针与“above”/“below”指针完全相同。
祝你在作业中好运。我曾经在我的数据结构课程上得到过同样的作业。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接