在Splay Trees Wikipedia page上说(在优势部分):
创建splay树的持久数据结构版本的可能性 - 允许在更新后访问先前版本和新版本。 这在函数式编程中非常有用,并且每次更新需要分摊O(log n)空间。
为什么?功能编程如何特别利用持久性Splay树?
答案 0 :(得分:6)
你的问题似乎来自持续不幸的术语混淆。一个更好的短语可能是纯函数,即没有破坏性变异的函数式编程。这种混淆可能源于这样一个事实:由于各种原因,不可变的持久数据结构在整个函数式编程中更为常见。
简而言之,您可以将该短语读作“在仅使用不可变数据结构进行编程时创建持久的splay树非常有用”,这与重言式有关。
答案 1 :(得分:4)
现代功能编程的一个驱动目标是更好地管理状态,最好尽可能少地使用它,因为有状态程序必须以正确的顺序小心地执行命令以避免错误。
持久性数据结构非常精确,因为它们不使用可变状态,允许它们用于纯粹和不可变的计算
//mutable tree
var t = new_tree();
add(t, 1);
add(t, 2);
//the tree has now changed so if anyone was depending on the old value
//we will now have a problem
//persistent tree
var t = new_tree();
var t2 = add(t, 1);
var t3 = add(t2, 2);
//t1 and t2 have not changed
您指出的引用只是强调持久性数据结构在纯函数式编程中是常用的(并且是首选的)。在这种情况下,splay树没什么特别的。
答案 2 :(得分:0)
我甚至认为相反,splay树在函数式编程中使用起来不太舒服,因为即使在每次查找操作之后都需要返回新树,并且几乎所有操作都要跟踪最后一棵树。 此外,我所知道的所有搜索树都可以直接在功能上使用,每个操作有额外的O(log n)空间。 我想在这句话中唯一有趣的事实是每个操作的内存需求保持O(log n)摊销,即使我们一直在重构树,但请注意,现在我们甚至为搜索支付了空间价格。