在对数时间内移除 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
集合界面,该界面按排序顺序维护元素并允许重复。实现包括:
我正在使用 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
集合界面,该界面按排序顺序维护元素并允许重复。实现包括: