【发布时间】:2014-12-03 22:43:04
【问题描述】:
跳过列表是一种数据结构,其中元素按排序顺序存储,列表的每个节点可能包含多个指针,用于减少搜索所需的时间对于一般情况,从单链表中的O(n) 到O(lg n) 的操作。它看起来像这样:
参考:Wojciech Muła 的“跳过列表” - 自己的作品。通过 Wikimedia Commons 在公共领域获得许可 - http://commons.wikimedia.org/wiki/File:Skip_list.svg#mediaviewer/File:Skip_list.svg
可以看作是尺子的类比:
在跳过列表中,搜索一个元素并删除一个元素很好,但是插入时就变得困难了,因为根据Data Structures and Algorithms in C++: 2nd edition by Adam Drozdek:
要插入一个新元素,刚插入的节点后面的所有节点都必须重组;指针的数量和指针的值必须改变。
我可以由此解释,尽管根据节点插入新元素的可能性来选择具有随机指针数量的节点,但不会创建完美的跳过列表,但当大量元素时它会非常接近它(例如约 900 万)被考虑。
我的问题是:为什么我们不能在一个新节点中插入新元素,根据前一个节点确定它的指针个数,附加到链表的末尾,然后使用高效的排序算法仅对节点中存在的数据进行排序,从而保持跳过列表的完美结构并实现O(lg n)插入复杂度?
编辑:我还没有尝试任何代码,我只是呈现一个视图。仅仅因为实现跳过列表有些困难。对不起。
【问题讨论】:
-
我不明白为什么插入节点之后的所有节点都需要更改。为什么不像普通链表一样插入并完成它呢?跳过列表不一定需要“快速”跃点之间的间距。
标签: c++ algorithm data-structures