C++ 插入到跳过列表中

C++ 插入到跳过列表中,c++,algorithm,data-structures,C++,Algorithm,Data Structures,跳过列表是一种数据结构,其中元素按排序顺序存储,列表的每个节点可能包含一个以上的指针,用于将搜索操作所需的时间从单个链接列表中的O(n)减少到平均情况下的O(lg n)。看起来是这样的: 参考:Wojciech Muła的《跳过列表》——他自己的作品。通过Wikimedia Commons获得公共领域许可- 这可以被看作是一个类似于尺子的比喻: 在跳过列表中,搜索一个元素并删除一个元素是可以的,但当涉及到插入时,它变得很困难,因为根据Adam Drozdek的《C++中的数据结构和算法:第二

跳过列表是一种数据结构,其中元素按排序顺序存储,列表的每个节点可能包含一个以上的指针,用于将搜索操作所需的时间从单个链接列表中的
O(n)
减少到平均情况下的
O(lg n)
。看起来是这样的:

参考:Wojciech Muła的《跳过列表》——他自己的作品。通过Wikimedia Commons获得公共领域许可-

这可以被看作是一个类似于尺子的比喻:

在跳过列表中,搜索一个元素并删除一个元素是可以的,但当涉及到插入时,它变得很困难,因为根据Adam Drozdek的《C++中的数据结构和算法:第二版》:

要插入新元素,必须重新构造刚插入的节点后面的所有节点;指针的数量和指针的值必须更改


我可以从中分析,尽管根据节点插入新元素的可能性选择具有随机指针数的节点并不能创建一个完美的跳过列表,但当考虑大量元素(例如约900万个)时,它会变得非常接近

我的问题是:为什么我们不能在新节点中插入新元素,根据上一个节点确定其指针数量,将其附加到列表的末尾,然后使用有效的排序算法对节点中的数据进行排序,从而保持跳过列表的完美结构,并实现
O(lgn)
插入复杂性


编辑:我还没有尝试任何代码,我只是展示一个视图。只是因为实现跳过列表有些困难。抱歉。

您在这一点上遇到了问题
,然后使用有效的排序算法对节点中的数据进行排序。对数据进行排序将具有复杂性
O(n*lg(n))
,因此会增加插入的复杂性。理论上,您可以为插入的每个节点选择“完美”数量的链接,但即使这样做,当您执行删除操作时,完美性也将被“破坏”。使用随机化的方法足够接近完美的结构,以实现良好的性能。

您需要具有搜索位置的功能/方法

它需要做到以下几点:

  • 如果插入唯一键,则需要定位节点。然后你保留一切,只需更改数据(行李)。e、 g.节点->数据=数据

  • 如果允许重复,或者未找到关键点,则此函数/方法需要为您提供每个高度(车道)上的上一个节点。然后确定新节点的高度,并将其插入到找到的节点之后

  • 以下是我的C意识:

    您需要检查以下功能:

    static const hm_skiplist_node_t *_hm_skiplist_locate(const hm_skiplist_t *l, const char *key, int complete_evaluation);
    
    它将位置存储在hm_skiplist_t结构中


    完整评估用于节省时间,以防您需要数据而不打算插入/删除。

    插入节点时,无需修改以下任何节点。有关详细信息,请参阅原始文件

    我已经根据该引用实现了一个跳过列表,我可以向您保证,我的插入和删除例程不会修改插入点前面的任何节点


    我没有读过你所指的那本书,但是断章取义,你强调的那一段完全错了。

    我不明白为什么插入的那一段后面的所有节点都需要更改。为什么不像普通的链表一样插入并使用它呢?跳过列表不一定需要“快速”跳之间的间隔。