我知道左右儿童的RB树可以以纯粹的功能方式实现,而不会降低日志性能。父对象的树可以在对数时间内实现吗?好像是循环引用子 - > parent和parent-> child需要克隆所有树,因此需要线性时间。
答案 0 :(得分:3)
完全持久的纯功能数据结构是树形的,但可以利用指针共享来成为有向无环图。但是,一旦引入指针循环,就不能在不复制整个子图的情况下“更改”该子图的一部分。
解决方案是添加间接:为值分配“身份”,可以是对象(如Clojure的原子)或用作查找键的简单值(如数字或符号)。您可以将不可变指针视为IDeref的实现,它始终返回相同的对象。循环图可以表示为邻接图,其中按名称“解析”节点与在节点的名称映射中查找它是相同的。
有关表示完全持久性图表的更多信息,请参阅Fully Persistent Graphs - Which One to Choose?。