_评论由: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 集合的通用子集函数)实现;正如你预期的那样,除了最小的输出大小外,它对几乎所有其他输出大小都极为缓慢。