Data structures 跳过列表--是否使用过它们?

Data structures 跳过列表--是否使用过它们?,data-structures,binary-tree,skip-lists,Data Structures,Binary Tree,Skip Lists,我想知道这里是否有人用过手机。它看起来与平衡二叉树具有大致相同的优点,但更易于实现。如果有,您是自己编写的,还是使用预先编写的库(如果有,它的名称是什么)?几年前,我为规则引擎实现了一个称为反向跳过列表的变体。基本相同,但引用链接从最后一个元素向后运行 这是因为插入最有可能朝向集合后端的已排序项的速度更快 它是用C语言编写的,需要几次迭代才能成功运行。实际上,对于我的一个项目,我正在实现我自己的完整STL。我使用skiplist来实现我的std::map。我之所以选择它,是因为它是一个简单的算法

我想知道这里是否有人用过手机。它看起来与平衡二叉树具有大致相同的优点,但更易于实现。如果有,您是自己编写的,还是使用预先编写的库(如果有,它的名称是什么)?

几年前,我为规则引擎实现了一个称为反向跳过列表的变体。基本相同,但引用链接从最后一个元素向后运行

这是因为插入最有可能朝向集合后端的已排序项的速度更快


它是用C语言编写的,需要几次迭代才能成功运行。

实际上,对于我的一个项目,我正在实现我自己的完整STL。我使用skiplist来实现我的
std::map
。我之所以选择它,是因为它是一个简单的算法,非常接近于平衡树的性能,但具有更简单的迭代功能


另外,他也是一个skiplist,这也是我在
std::map

中使用它的最初灵感。几年前,我为概率算法类实现了自己的。我不知道有任何库实现,但已经有很长时间了。实现起来非常简单。我记得,它们对于大型数据集有一些非常好的特性,并且避免了一些重新平衡的问题。我认为实现通常也比二进制尝试简单。这里有一个很好的讨论和一些C++代码:

还有一个小程序正在运行演示。可爱的90年代爪哇光泽度:

Java1.6(JavaSE6)引入并加入到集合框架中。所以,我推测有人真的在使用它们

在多线程情况下,SkipList倾向于提供更少的锁争用,并且(可能)具有类似于树的性能特征


请参阅William Pugh的[pdf]。

我的理解是,它们与其说是二叉树(例如红黑树)的有用替代品,不如说是数据库使用的B树,这样您就可以将级别保持在可行的最低水平,并处理w/base-K日志,而不是base-2日志,以获得性能特征。概率跳过列表的算法(IMHO)比相应的B-树算法更容易获得正确的结果。另外还有一些关于无锁跳过列表的文献。几个月前我曾考虑过使用它们,但后来放弃了探索图书馆的努力

有关该主题的文献:

比尔·普格的论文:

非学术论文/教程:

  • (对几种数据结构进行了一些讨论)
  • 托马斯·阿纳斯塔西奥

    • 跳过列表很容易实现。但是,在插入和删除时,调整跳过列表上的指针必须小心。没有在实际的程序中使用它,但是没有进行一些运行时评测。跳过列表与搜索树不同。相似之处在于,它给出了一段时间字典操作的平均日志(n),就像splay树一样。它优于不平衡搜索树,但不优于平衡树

      每个跳过列表节点都有向前指针,这些指针表示到跳过列表不同级别的当前->下一步()连接。通常,该级别的最大值为ln(N)。因此,如果N=100万,则水平为13。将有那么多的指针,在Java中,这意味着实现引用数据类型的指针数量将增加两倍。其中,作为一个平衡的搜索树,它拥有更少的资源,并提供相同的运行时间


      根据字典查找操作的分析,一个带锁哈希表将给出小于0.010毫秒的结果,其中一个splay树给出~1毫秒,跳过列表~720ms

      跳过列表具有与二进制搜索算法相同的对数搜索时间界限,但它将该性能扩展到在插入或删除条目时更新方法。尽管如此,跳过列表的边界是预期的,而排序表的二进制搜索有一个最坏的边界。

      我接受这个边界是因为它引用了DDJ文章。向Even和Steve道歉,如果可以的话,我会接受所有三个答案。Java链接已经不存在了。Evan,你有没有让skiplist代码在任何地方都可用?感谢还没有,但事情已经到了我可以发布STL的地步。但是有很多示例跳过列表实现。是的,有很多可用的跳过列表代码。我正在寻找一些特别符合std::map接口的东西。QMap看起来非常接近,所以我将尝试一下。谢谢你,你能不能把类型的比较颠倒过来,用一个标准的skiplist来达到同样的结果?@oɔɯǝɹ你可能是对的。但是这个反向跳过列表可能更自然地与SQL Server和其他数据库兼容(因此数据库完全镜像了数据)。有时,代码的形状会产生不同,有点像俄罗斯方块。参见二叉树的替代品,你的意思是平衡二叉树吗?。。。你是在问我10年前写的一篇文章吗?我刚刚浏览了一下,这里的投票率最高。所以我想花点时间来了解细节。