在对数时间内移除 TreeMap 的子图

Remove submap of TreeMap in logarithmic time

我正在使用 TreeMap<Integer, Integer> 来表示可以包含重复元素的排序列表。键对应于列表中的任意值,映射值对应于出现的次数。我正在使用排序列表概念,因为我需要有效地操作子列表(log n 时间)并且我正在使用 TreeMap 因为 Java 没有任何默认的排序列表实现。

但是,我注意到我的算法的性能比预期的要慢,所以在做了一些研究之后,subMap 方法似乎需要 O(log n + k) 时间,其中 n 是地图的大小, k 是子图中的元素数。对于 k 相对于 n 的大值,这接近于线性时间。

如何在亚线性时间内对子图(子列表)进行操作;或者,有没有更好的方法可以表示 Java?

中的排序列表

这个问题背后的动机:将树图想象成一个二叉搜索树,我想找到某个子树的第一个节点,然后将其用作整棵树本身,有效地删除树的其余部分.理想情况下,这只需要 O(log n) 时间。

Google 的 Guava library has an extensive suite of collection classes 很好地补充了标准库中的那些。

Guava is a set of core Java libraries from Google that includes new collection types (such as multimap and multiset), immutable collections, a graph library, and utilities for concurrency, I/O, hashing, caching, primitives, strings, and more! It is widely used on most Java projects within Google, and widely used by many other companies as well.

您可能会喜欢他们的 SortedMultiset 集合界面,该界面按排序顺序维护元素并允许重复。实现包括: