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

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

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

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


当前回答

直角三角形网络(RTIN)

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

其他回答

min-max堆是实现双端优先级队列的堆的变体。它通过简单地更改堆属性来实现这一点:如果偶数(奇数)级别上的每个元素都小于(大于)所有子级和孙子级,则称树为最小-最大排序。级别从1开始编号。

http://internet512.chonbuk.ac.kr/datastructure/heap/img/heap8.jpg

空间索引,特别是R-树和KD树,有效地存储空间数据。它们适用于地理地图坐标数据和VLSI位置和路线算法,有时也适用于最近邻搜索。

位阵列紧凑地存储单个位,并允许快速位操作。

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

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

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

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

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