周围有一些数据结构非常有用,但大多数程序员都不知道。他们是哪一个?

每个人都知道链表、二叉树和散列,但比如Skip列表和Bloom过滤器。我想知道更多不太常见但值得了解的数据结构,因为它们依赖于伟大的想法,丰富了程序员的工具箱。

PS:我还对舞蹈链接等技术感兴趣,这些技术巧妙地利用了通用数据结构的财产。

编辑:请尝试包含更详细描述数据结构的页面链接。此外,试着补充几句关于数据结构为什么很酷的话(正如乔纳斯·Kölker已经指出的那样)。此外,尝试为每个答案提供一个数据结构。这将允许更好的数据结构仅根据其投票结果浮到顶部。


当前回答

铲斗大队

它们在Apache中被广泛使用。基本上,它们是一个在环中围绕自身循环的链接列表。我不确定它们是否在Apache和Apache模块之外使用,但它们适合作为一种很酷但鲜为人知的数据结构。桶是一些任意数据的容器,桶大队是桶的集合。其思想是,您希望能够在结构中的任何点修改和插入数据。

假设您有一个bucket旅,其中包含一个html文档,每个bucket包含一个字符。您希望将所有<和>符号转换为&lt;并且&gt;实体。当您遇到<或>符号时,bucket旅允许您在旅中插入一些额外的bucket,以适应实体所需的额外字符。因为铲斗大队在一个环中,您可以向后或向前插入。这比使用简单的缓冲区要容易得多(在C语言中)。

关于铲斗大队的一些参考信息如下:

Apache Bucket旅参考

Buckets和Brigades简介

其他回答

Van Emde Boas树。我甚至有一个C++实现,最多支持2^20个整数。

我认为当您需要将一堆项目划分为不同的集合和查询成员时,不联合集合非常适合。联合和查找操作的良好实施导致摊余成本实际上是恒定的(如果我正确回忆起我的数据结构类,则与阿克曼南函数相反)。

我喜欢treaps——这是一个简单而有效的想法,即在二进制搜索树上叠加具有随机优先级的堆结构,以平衡它。

芬威克树。这是一种数据结构,用于计算向量中两个给定的子索引i和j之间的所有元素的总和。简单的解决方案是,从开始时就预先计算总和,不允许更新项目(必须做O(n)工作才能跟上)。

Fenwick Trees允许您在O(logn)中更新和查询,它的工作方式非常简单。芬威克的原始论文对这一点做了很好的解释,可以在这里免费获得:

http://www.cs.ubc.ca/local/reading/proceedings/spe91-95/spe/vol24/issue3/spe884.pdf

它的父亲RQM树也很酷:它允许您保存关于向量的两个索引之间的最小元素的信息,它还可以在O(logn)更新和查询中工作。我喜欢先教RQM,然后教芬威克树。

使用2个堆栈实现的队列非常节省空间(与使用至少有1个额外指针/引用开销的链接列表不同)。

如何使用两个堆栈实现队列?

当排队人数很大时,这对我来说效果很好。如果我在一个指针上节省了8个字节,这意味着拥有百万条目的队列节省了大约8MB的RAM。