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

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

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

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


当前回答

我喜欢缓存不可见的数据结构。其基本思想是以递归更小的块来布局树,以便许多不同大小的缓存可以利用适合它们的块。这导致了从RAM中的L1缓存到从磁盘读取的大块数据的所有缓存的高效使用,而无需了解任何缓存层的大小细节。

其他回答

绳子:这是一种允许廉价的前缀、子字符串、中间插入和附加的字符串。我真的只使用过一次,但其他结构都不够。常规的字符串和数组前缀对于我们所需要做的事情来说太昂贵了,而且逆转一切都是不可能的。

Scapegoat树。普通二叉树的一个典型问题是它们变得不平衡(例如,当按升序插入键时)

平衡二叉树(AKA AVL树)在每次插入后都会浪费大量时间进行平衡。

红黑树保持平衡,但每个节点都需要额外的存储空间。

Scapegoat树像红黑树一样保持平衡,但不需要任何额外的存储。他们通过在每次插入后分析树并进行微小调整来实现这一点。看见http://en.wikipedia.org/wiki/Scapegoat_tree.

看看手指树,特别是如果你是前面提到的纯函数数据结构的粉丝。它们是持久序列的功能表示,支持以摊销的恒定时间访问末端,以及以较小片段的大小按时间对数连接和拆分。

根据原文:

我们的函数2-3指树是Okasaki(1998)介绍的一种通用设计技术的一个实例,称为隐式递归减速。我们已经注意到,这些树是他的隐式deque结构的扩展,用2-3个节点替换对,以提供高效连接和拆分所需的灵活性。

手指树可以用幺半群参数化,使用不同的幺半群将导致树的不同行为。这使手指树可以模拟其他数据结构。

看看唐纳德·克努思(Donald Knuth)展示的侧面堆。

http://stanford-online.stanford.edu/seminars/knuth/071203-knuth-300.asx

成对堆是一种堆数据结构,具有相对简单的实现和出色的实际摊余性能。