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

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

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

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


当前回答

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

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

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

其他回答

芬威克树。这是一种数据结构,用于计算向量中两个给定的子索引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,然后教芬威克树。

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

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

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

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

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

直角三角形网络(RTIN)

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

工作窃取队列

无锁数据结构,用于在多个线程之间平均分配工作C/C++中工作窃取队列的实现?