我需要一种快速计算TreeSet(整数)中小于X元素数量的方法。
我可以使用subSet()、headSet()和tailSet()方法,但它们非常缓慢(我只需要计数,而不是数字本身)。 有没有办法?
谢谢。
编辑:
我找到了一个解决方法,使事情更快! 我正在使用BitSet及其cardinality()方法。 首先创建一个BitSet,并为添加到TreeSet中的每个元素设置相应的位。 现在,要计算小于X的元素数量,我使用:
bitset.get(0, X + 1).cardinality()
这比treeset.subSet(0, true, X, true).size()快得多。
有人知道为什么吗? 我假设BitSet.cardinality()不使用线性搜索。
我可以使用subSet()、headSet()和tailSet()方法,但它们非常缓慢(我只需要计数,而不是数字本身)。 有没有办法?
谢谢。
编辑:
我找到了一个解决方法,使事情更快! 我正在使用BitSet及其cardinality()方法。 首先创建一个BitSet,并为添加到TreeSet中的每个元素设置相应的位。 现在,要计算小于X的元素数量,我使用:
bitset.get(0, X + 1).cardinality()
这比treeset.subSet(0, true, X, true).size()快得多。
有人知道为什么吗? 我假设BitSet.cardinality()不使用线性搜索。
TreeMultiset
,它支持在 O(log n) 时间复杂度内执行headMultiset(element).size()
操作,而非 O(n)。虽然它与TreeSet
不完全相同,但是headMultiset(element).elementSet().size()
也可以在 O(log n) 时间复杂度内完成。 - Louis Wasserman