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

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

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

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


当前回答

跳过列表实际上非常棒:http://en.wikipedia.org/wiki/Skip_list

其他回答

直角三角形网络(RTIN)

非常简单的自适应细分网格的方法。拆分和合并操作只需要几行代码。

PATRICIA-检索字母数字编码信息的实用算法,D.R.Morrison(1968)。

PATRICIA树与Trie相关。Tries的问题是,当密钥集稀疏时,即当实际密钥形成潜在密钥集的一个子集时,Trie中的许多(大多数)内部节点只有一个后代,这是非常常见的情况。这导致Trie具有较高的空间复杂性。

http://www.csse.monash.edu.au/~合金/瓷砖AlgdS/树/PATRICIA/

Kd-Trees是实时光线跟踪中使用的空间数据结构,它的缺点是需要裁剪与不同空间交叉的三角形。一般来说,BVH更快,因为它们更轻。MX-CIF四叉树,通过将规则四叉树与四叉树边缘的二叉树组合,存储边界框而不是任意点集。HAMT,由于所涉及的常数,访问时间通常超过O(1)个哈希图的分层哈希图。反向索引,在搜索引擎界非常有名,因为它用于快速检索与不同搜索词相关的文档。

大多数(如果不是全部)记录在NIST算法和数据结构词典中

Bloom过滤器:m位的位数组,最初全部设置为0。

要添加一个项,您可以通过k个哈希函数运行它,该函数将在数组中为您提供k个索引,然后将其设置为1。

要检查集合中是否有项目,请计算k个索引并检查它们是否都设置为1。

当然,这给出了一些误报的概率(根据维基百科,大约是0.61^(m/n),其中n是插入项目的数量)。假阴性是不可能的。

删除项是不可能的,但您可以实现计数布隆过滤器,由整数数组和递增/递减表示。

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

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

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