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

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

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

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


当前回答

我真的很喜欢间隔树。它们允许您获取一组时间间隔(即开始/结束时间或其他时间),并查询哪些时间间隔包含给定时间,或哪些时间间隔在给定时间段内“活动”。查询可以在O(log n)中完成,预处理是O(n log n)。

其他回答

有一种巧妙的数据结构,它使用数组来保存元素的数据,但数组在链接列表/数组中链接在一起。

这确实具有这样的优点,即对元素的迭代非常快(比纯链接列表方法更快),并且在内存和/或(去)分配中移动带有元素的数组的成本最低。(正因为如此,此数据结构对于模拟工作非常有用)。

我从这里知道:

http://software.intel.com/en-us/blogs/2010/03/26/linked-list-verses-array/

“……并且一个额外的数组被分配并链接到粒子数组的单元格列表中。这在某些方面类似于TBB实现其并发容器的方式。”(这是关于链接列表与数组的性能)

三元搜索树

快速前缀搜索(用于增量自动完成等)部分匹配(当您想查找字符串X汉明距离内的所有单词时)通配符搜索

很容易实施。

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

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

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

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

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

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

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

DAWG是一种特殊的Trie,其中类似的子树被压缩为单亲。我扩展了修改后的DAWG,并提出了一个漂亮的数据结构ASSDAWG(Anagram Search Sorted DAWG)。这种工作方式是,每当将字符串插入DAWG时,首先对其进行桶排序,然后插入,叶节点保存一个额外的数字,指示如果我们从根到达该叶节点,哪些排列是有效的。这有两大优点:

由于我在插入之前对字符串进行排序,并且DAWG自然会折叠类似的子树,所以我得到了高级别的压缩(例如,“吃”、“吃”和“茶”都变成了一条路径a-e-t,在叶节点处有一个数字列表,指示a-e-t的哪些排列是有效的)。搜索给定字符串的变位现在是非常快速和简单的,因为从根到叶的路径使用排列数保存了叶节点处该路径的所有有效变位。