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

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

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

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


当前回答

正确的字符串数据结构。几乎每个程序员都满足于一种语言对结构的任何原生支持,而这种支持通常是低效的(尤其是对于构建字符串,你需要一个单独的类或其他东西)。

最糟糕的是将字符串作为C中的字符数组,并依赖NULL字节来确保安全。

其他回答

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

根据原文:

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

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

展开的链接列表是链接列表的变体,它在每个节点中存储多个元素。它可以显著提高缓存性能,同时减少与存储列表元数据(如引用)相关的内存开销。它与B树有关。

record node {
    node next       // reference to next node in list
    int numElements // number of elements in this node, up to maxElements
    array elements  // an array of numElements elements, with space allocated for maxElements elements
}

Splash桌很棒。它们就像一个普通的哈希表,只是它们保证了恒定的时间查找,并且可以处理90%的利用率而不损失性能。它们是布谷鸟哈希(也是一种很棒的数据结构)的推广。它们看起来确实有专利,但和大多数纯软件专利一样,我不会太担心。

向左倾斜的红黑树。罗伯特·塞奇威克(Robert Sedgewick)于2008年发表的红黑树的一个显著简化的实现(大约是要实现的代码行的一半)。如果您在红黑树的实现方面遇到过困难,请阅读此变体。

与安德森树非常相似(如果不是完全相同)。

其他人已经提出了Burkhard Keller Trees,但我想我可能会再次提及它们,以便插入我自己的实现

http://well-adjusted.de/mspace.py/index.html

周围有更快的实现(参见ActiveState的Python配方或其他语言的实现),但我认为/希望我的代码有助于理解这些数据结构。

顺便说一句,BK和VP树可用于搜索类似字符串。只要距离函数满足几个条件(正、对称、三角形不等式),就可以对任意对象进行相似性搜索。