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

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

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

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


当前回答

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

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

其他回答

任何有3D渲染经验的人都应该熟悉BSP树。通常,这是一种通过构造3D场景来进行渲染的方法,该方法可以在知道相机坐标和方位的情况下进行管理。

二进制空间分区(BSP)是一种递归细分a的方法通过超平面将空间划分为凸集。该细分产生通过方法表示场景树数据结构的BSP树。换句话说,这是一种方法形状复杂的破碎多边形转化为凸集,或更小多边形完全由非反射角(小于180°). 更一般的描述空间分区,请参见空间分区。最初,提出了这种方法在3D计算机图形方面渲染效率。其他一些应用程序包括执行具有形状的几何操作(构造实体几何),机器人和3D中的碰撞检测计算机游戏和其他计算机涉及处理的应用程序复杂的空间场景。

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

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

我喜欢字符串处理的后缀树和数组,平衡列表的跳过列表,自动平衡树的显示树

斐波那契堆

它们被用于一些已知的最快算法(渐近)中,用于许多与图相关的问题,例如最短路径问题。Dijkstra的算法在标准二进制堆的O(E log V)时间内运行;使用斐波那契堆将其提高到O(E+V log V),这对于密集图来说是一个巨大的加速。然而,不幸的是,它们有一个很高的恒定因子,往往使它们在实践中不切实际。

远离所有这些图形结构,我只喜欢简单的环形缓冲区。

如果实施得当,您可以在保持性能的同时,甚至可以提高性能,从而大大减少内存占用。