[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放在适当的位置。
所以我决定尝试创建一个排序的双向跳表...
我相信我已经很好地掌握了它的工作原理。当你插入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放在适当的位置。