有哪些不太为人知但很有用的数据结构?

793

有一些数据结构对于大多数程序员来说很有用,但是却不为人所知。它们都是哪些呢?

每个人都知道链表、二叉树和哈希表,但是例如跳表布隆过滤器呢?我想了解更多不太常见但值得知道的数据结构,因为它们依赖于巨大的思想,并且丰富了程序员的工具箱。

PS:我还对像舞蹈链这样聪明地利用常见数据结构属性的技术感兴趣。

编辑: 请尝试在描述数据结构的页面中包含链接。此外,请尽量添加一些关于为什么某个数据结构很酷的词语(正如Jonas Kölker 已经指出的)。此外,请每次只提供一个数据结构的答案。这将使更好的数据结构根据它们的投票结果浮现在最上面。


16
http://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%88%97%E8%A1%A8 + http://zh.wikipedia.org/wiki/%E4%BA%8C%E5%86%B3%E5%AE%9A%E5%9B%BE - Fanatic23
83个回答

3

三叉查找树

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

非常容易实现。


3

使用两个栈实现队列非常节省空间(与使用至少一个额外指针/引用开销的链表相比)。

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

当队列很大时,这对我非常有效。如果我能在指针上节省8字节,那么有一百万条记录的队列就可以节省约8MB的RAM。


3

2

一个合适的字符串数据结构。几乎每个程序员都会使用语言本身对该结构的支持,但通常这种方式效率低下(特别是对于构建字符串而言,你需要一个单独的类或其他东西)。

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


3
另一个极端是C++,在这里每个自重的库都带有自己的字符串数据类型,当然与除“const char*”之外的所有其他字符串类型不兼容。个人而言,我更喜欢不必花费太多时间将字符串从一种类型转换为另一种类型的环境。 - Niki
这就是我称赞C#的原因之一。除了字符串或StringBuilder本地类型用于文本外,你很少需要其他东西。 - sergiol


2

我个人认为稀疏矩阵数据结构非常有趣。 http://www.netlib.org/linalg/html_templates/node90.html

著名的BLAS库使用这些。当您处理包含数十万行和列的线性系统时,使用它们变得至关重要。其中一些也类似于紧凑网格(基本上像桶排序的网格),这在计算机图形中很常见。 http://www.cs.kuleuven.be/~ares/publications/LD08CFRGRT/LD08CFRGRT.pdf

就计算机图形而言,MAC网格有点有趣,但只是因为它们很聪明。 http://www.seas.upenn.edu/~cis665/projects/Liquation_665_Report.pdf


2

2
不相交集合森林”允许快速进行成员查询和联合操作,最著名的应用是在Kruskal算法中用于生成最小生成树。
真正酷的事情是,这两个操作的平摊运行时间与Ackermann函数的倒数成比例,使得这成为“最快”的非常量时间数据结构。

2

一个角缝合数据结构。从摘要中可以看出:

角缝合是一种表示矩形二维对象的技术。它似乎特别适用于VLSI布局交互式编辑系统。该数据结构具有两个重要特点:首先,明确地表示了空白区域;其次,矩形区域在其角落处被缝合在一起,就像拼布一样。这种组织形式导致快速算法(线性时间或更好)用于搜索、创建、删除、拉伸和压缩。该算法是在简化的VLSI电路模型下提出的,并讨论了该结构的存储要求。测量表明,角缝合需要大约三倍于最简单表示的内存空间。


2

Burrows–Wheeler转换(块排序压缩)

它是压缩的基本算法。假设您想要压缩文本文件中的行。您可能会说,如果对这些行进行排序,就会丢失信息。但是BWT的工作方式是通过对输入进行排序来大大降低熵,并保留整数索引以恢复原始顺序。


2
BWT纯粹只是一种算法,而不是数据结构。 - J D
2
@Jon,你在技术上是正确的,但为什么要区分呢?在设计数据结构时,我经常发现数据结构和其周围的算法是相辅相成的。一个暗示着另一个。换句话说,数据结构的整个重点不就是可以对其执行的操作以及它们的运行时间和内存使用吗?我可以说,Burrows-Wheeler变换加上游程编码的数据结构是一种用于表示任意字符串的数据结构,其内存使用(与常规字符数组不同)对于许多字符串而言小于O(n)。这很有趣。 - Jonathan Tran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接