如何选择功能字典数据结构?


10

我已经阅读了一些有关以下数据结构的信息:

  • Bagwell的理想哈希尝试
  • Larson的动态哈希表
  • 红黑树
  • 帕特里夏树

...我敢肯定还有很多其他人。对于每个人都更适合的方式,或者为什么我会选择一个而不是另一个,我很少见。因此,以下是这些方面的一些问题:

  1. 重要的是要了解哪些功能词典数据结构?
  2. 这些方法的优缺点是什么?
  3. 什么时候使用更命令性的数据结构有意义?

数字2和3是最重要的数字。:-)



这个问题(编号为3的项目除外)具有[大列表]的感觉。
卡夫

2
了解以上链接的问题是否可以解决您的问题将很有帮助,如果不是,为什么?
Suresh Venkat 2010年

@Suresh-答案为#1,但最重要的是2和3。我主要是在寻找大概览,因此我可以确定哪些值得更深入的研究。
杰森

2
好。因此,可能值得编辑该问题。
Suresh Venkat 2010年

Answers:


16

我无法真正回答第二个问题而不会迷失方向(可以用来比较这些结构的维度太多),但是对于第三个问题,答案非常简单。

在以下情况下,请使用命令式数据结构:(a)绝对没有别名,或者(b)您确实需要使用别名才能有效广播。

如果根本没有数据结构的别名,那么您就不会利用功能性数据结构是持久的这一事实。因此,没有理由支付其费用。此建议有两个警告。首先,您可能更喜欢功能数据结构的实现的简单性:对功能性红黑树执行删除将使您受到诅咒,但是在具有父指针的命令性红黑树中实现删除将使您打算自杀。其次,分配可能比使用gc'd语言所期望的要昂贵,因为写入可以使数据结构移出年轻一代。我们确实没有很好的缓存效果和gc理论,因此您别无选择,只能进行基准测试。

其次,如果您需要广播频道,那么共享数据结构是一种很好的方法。使用恒定时间更新,您可以任意告诉其他许多人值已更改。(这就是为什么union-find是这么好的数据结构的原因。)使用纯粹的功能设置,您需要修改所有其他人员,或者为他们提供抽象的指针,使其成为您手动编码的状态(这有点钝)要做的事)。

如果您不希望使用别名和对象所有权,或者您需要同一数据结构的多个版本(例如,您需要新版本和旧版本),则只需使用功能数据结构即可。

我发现遵循该建议最困难的地方是图形算法。有很多非常优雅的命令式图算法,但是通常情况下(例如,在编写编译器时)您也需要持久性。人们通常尝试拆分差异并使用酷命令式算法,但尝试将版本控制附加到一边以获得持久性。这通常是非常可怕的,充满了错误,并且容易失去命令式算法的性能优势。


2
在这种情况下,别名是什么?
Suresh Venkat 2010年

6
别名是指对同一数据有多个引用。如果该数据是可变的,则关于使用该数据的程序的推理必须明确考虑所有可能访问和修改它的其他子程序。如果那条数据是不可变的,那么您可以在本地对使用它的程序进行推理,而忽略别名,因为您不知道可以访问该数据的任何人都不能对其进行修改。
Neel Krishnaswami

“但是在带有父指针的命令式红黑树中实施删除将使您打算自杀”请查看Sedgewick左倾的红黑树。删除的一般情况通过标准技巧减少为delete-min,对于LLRB树,delete-min本身非常简单。无需父指针。
Per Vognsen 2011年

1
“这通常是非常可怕的,充满了错误,并且容易失去命令式算法的性能优势。” 诺曼·拉姆齐(Norman Ramsey)的有关在优化的编译器中使用拉链控制流图的论文提供了令人信服的折衷方法的示例。您实际上有一个本地堆来支持CFG中基本块之间的引用的便捷有效地就地重新布线,但是对基本块内容的操作是功能性的(或半功能性的,具体取决于您对拉链的看法)。
Per Vognsen 2011年

1

重要的是要了解哪些功能词典数据结构?

高度平衡的二叉树及其尝试是一个很好的全面折衷方案。也:

  • 帕特里夏树。
  • 哈希尝试。

这些方法的优缺点是什么?

高度平衡的二叉树及其尝试是对原子密钥的全面妥协。序列键(例如字符串键)的尝试相同。

Patricia树可以快几倍,但只允许使用整数键。

哈希尝试可能比平衡二叉树快几倍,特别是如果哈希比比较便宜并且多态性有开销(例如.NET上的字符串)并且将指针写入堆的速度较快(例如,像JVM和CLR这样的虚拟机已经针对命令性语言而非功能性语言进行了优化)。哈希尝试还允许内部使用变异作为优化。

红黑树不那么重要,因为它们与高度平衡的树相比没有任何明显的好处,但是其显着的缺点是它们不允许有效的合并,交叉和区别。

同样,在实践中,手指树也不是更好。

什么时候使用更命令性的数据结构有意义?

当您的字典被填充一次,然后仅用于查找(即冻结)时。

当您需要性能时(像.NET这样的体面的哈希表Dictionary通常比任何通用的纯功能字典快10-40倍)。

当您需要弱字典时,因为没有已知的纯功能弱字典。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.