_评论者:michalmarczyk_
{{subseq}} 和 {{rsubseq}} + {{first}} 解决了 {{NavigableMap}} 中的 "邻居查找" 部分,但不是子映射方法。
在对红黑树进行子集操作时,以对数时间完成是完全可能的,但不维护如下性质:结果结构的 {{count}} 如果不是 O(1),则至少显著优于 O(n)。这是因为无法在没有实际遍历或预先存储节点标注的情况下知道 BST 中任何子范围包含多少节点。
我在去年11月的 Conj 演讲中描述了一种可能的解决方案,我还在某处有一个草图,但它不会提供 data.avl 那样的便捷性——上述限制是基本的;它可能适用于几乎不调用 {{count}} 的情况。
作为旁白,data.avl 在其测试套件中使用基于 {{subseq}} 等 的邻接查找实现,作为对 clojure.data.avl/nearest 直接使用的合理性检查。此外,还有一个基于 {{subseq}} 的 {{subrange}} 实现(data.avl 集合的通用子集函数);正如预期的那样,除了在最小的输出尺寸外,它都非常慢。