_评论者: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 集合的通用子集函数)实现;正如预期的那样,对于所有但最小的输出大小来说,它都非常慢。