_评论者:michalmarczyk_
{{subseq}} 和 {{rsubseq}} + {{first}} 解决了 {{NavigableMap}} 的 "邻近查找" 部分,但不是子映射方法。
以对数时间分割红黑树是完全可能的,但如前所述,如果您想要保持结果结构上的 {{count}} 属性不是 O(1),至少也要比 O(n) 显著更好,这是不可能的。这是因为,没有方法知道 BST 的任何子范围内包含多少节点,除非实际遍历它或提前在节点(至少是部分节点)中存储注释。
我在去年十一月的 Conj 讲座中描述了一种可能的解决方案,我在某处有一个草图,但它不会提供像 data.avl 那样的便利类型;上面描述的限制是根本性的;它可能适用于在使用中几乎从不调用 {{count}} 的情况。
作为旁注,data.avl 在其测试套件中使用基于 {{subseq}} 等的邻近查找实现,作为对由 {{clojure.data.avl/nearest}} 使用的直接实现的合理性检查。它还有一个基于 {{subseq}} 的{{subrange}}实现(data.avl 集合的通用子集函数);如预期的那样,它对于所有除最小输出大小之外的所有情况都非常慢。