持久数据结构:持久性索引?

时间:2013-04-24 00:26:04

标签: javascript data-structures functional-programming lisp

功能编程使用不可变数据。当你修改某些内容时,你会重新复制“世界”,尽可能地为你的增强世界重用前一个版本。

我在JavaScript中探索FP。我创建了一个类似于Lisp中的List的List对象。你cons一个新的头部到现有的尾巴上。在将项添加到持久列表时,我想创建一个与列表一致的持久索引。因此,如果我cons将新联系人列入联系人列表,我可能需要索引姓氏和电话号码,这样我就可以快速找到项目,而无需有效地启动全表扫描。

问:在JavaScript中,可以构建哪种持久数据结构来提供快速键控访问?

也就是说,我认为这个想法是在构造增强索引时重用以前的索引数据。如果没有将前一个索引上的所有键克隆到增强索引中,我发现这个问题让人头脑麻木。通过克隆,这会在以编程方式加载数据时浪费大量内存。索引应该具有内存效率,并按值提供快速访问。

1 个答案:

答案 0 :(得分:2)

您可以使用某种自平衡二进制搜索树,就像使用任何其他语言一样(尽管在许多语言中,已经提供了这样的数据结构)。每个插入内容平均花费O(log n),包括重新平衡,这将创建O(log n)个新搜索节点。

一个相当简单的数据结构是splay tree。在Chris Okasaki的Purely Functional Datastructures中有一个可爱的splay树实现功能。事实上,那本书中有很多非常酷的数据结构。强烈推荐。 (如果你搜索,你可能会在网上找到Okasaki的论文,它也有splay tree的实现。)