持久数据结构是不可变的数据结构。对它们的操作将返回数据结构的新“副本”,但会被操作更改;尽管旧的数据结构保持不变。通常,通过共享一些基础数据并避免完全复制数据结构来实现效率。
问题:
是否存在关于可以使数据结构类别持久化(同时保持相同或非常相似的复杂性)的结果?
是否可以使所有数据结构具有持久性(同时保持相同或非常相似的复杂性)?
是否已知任何数据结构无法持久化(同时保持相同或非常相似的复杂性)?
持久数据结构是不可变的数据结构。对它们的操作将返回数据结构的新“副本”,但会被操作更改;尽管旧的数据结构保持不变。通常,通过共享一些基础数据并避免完全复制数据结构来实现效率。
问题:
是否存在关于可以使数据结构类别持久化(同时保持相同或非常相似的复杂性)的结果?
是否可以使所有数据结构具有持久性(同时保持相同或非常相似的复杂性)?
是否已知任何数据结构无法持久化(同时保持相同或非常相似的复杂性)?
Answers:
积极的结果:持久性并不会花费太多。可以证明,每个数据结构都可以完全持久化,而最多只能降低。
证明:您可以使用标准数据结构(例如,平衡的二叉树;请参见此答案的末尾以获取更多详细信息)来获取数组并使其持久化。这招致放缓:每个阵列访问采用ø (LG Ñ )时间与持久性数据结构中,而不是Ô (1 )时间非持久阵列。现在,采用所有在RAM模型中运行时间为O (f (n ))的命令式算法,其中n表示使用的内存量。将所有内存表示为一个大数组(带有元素),并使用持久性映射使其持久化。命令式算法的每一步最多导致 O (lg n )减慢,因此总运行时间为 O (f (n )lg n )。
显然可以做得更好:显然,可以使用下面引用的Demaine论文中的技术将减速因子降低为(预期的摊销时间),但是我不熟悉细节这项工作,所以我自己不能保证。感谢jbapple的观察。
负面结果:对于某些数据结构,您不可避免地会放慢速度。为了回答您的第三个问题,存在一些数据结构,在这些数据结构中,使它们持久化会导致速度降低。
特别是考虑元素的数组。在没有持久性的情况下,每个阵列访问都需要O (1 )时间(在RAM模型中)。有了持久性,显然已经证明,没有办法为访问随机元素构建具有O (1 )最坏情况复杂度的持久性数组。特别是,显然存在一个下限,表明完全持久性阵列必须具有Ω (lg lg n )的访问时间。此下限在以下论文的第3页中声明:
下界归因于Mihai Patrascu,但没有引用任何来源提供此断言下界证明的详细信息。
丰富的研究领域。 如果我们采用任意数据结构或算法,那么是否可以在不超过减慢的情况下使其持久化是一个微妙的问题。我不知道任何一般的分类定理。但是,对有效地使特定数据结构持久化的方法有很多研究。
与功能编程语言也有很强的联系。特别是,可以以纯粹的功能方式(无任何突变)实现的每个数据结构已经是持久性数据结构。(a然,情况不一定相反。)如果您要quin着眼睛,可以将其视为某种弱的部分分类定理:如果它可以在纯函数式编程语言中实现,并且具有与一种命令式语言,则存在一个持久性数据结构,其时间范围与非持久性数据结构相同。我意识到这可能不是您想要的,这主要只是对情况的琐碎重述。
您可以在以下资源中找到带有漂亮图片的更多说明:
在http://toves.org/books/persist/index.html上阅读标有“二进制搜索树”和“随机访问结构”(特别是树方法)的部分。
或者,阅读http://netcode.ru/dotnet/?artID=6592#BinaryTrees和后续的某些部分。
或者,阅读上面引用的Demaine论文的标有“功能数据结构”和“路径复制”的部分(从第4页开始):http : //erikdemaine.org/papers/ConfluentTries_Algorithmica/paper.pdf
那会给你主要思想。有更多细节需要注意,但是细节超出了此问题的范围。幸运的是,这些都是标准的东西,并且在文献中有很多关于如何构建这样的数据结构的信息。如果上面的资源不够用,请随意提出一个单独的问题,您需要有关构建持久性数组数据结构的详细信息的更多信息。