_评论者: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 集合的通用子集函数)也包含在内;正如你所期望的,对于除了最小输出大小之外的所有情况都非常慢。