TreeSet 中的过滤器方法时间复杂度

问题描述

val x = TreeSet<Int>(compareBy { it.toString() })
x.add(2);
x.add(4)
x.add(5)
x.add(15)
x.add(1)
x.add(34)
println(x)
print(x.filter { it in 5..19 })

我有一些类似于上面示例代码中提到的用例。我有一堆数据(大小可能非常大)考虑一个时间序列,我需要从列表中过滤掉 2 个日期之间的那些项目?有比 O(n) 方法更好的解决方案吗?

解决方法

这里的问题是您的 TreeSet 的排序顺序与范围不同,因此我们不能只在 TreeSet 中找到范围边界并取其间的所有内容。

如果 TreeSet 按自然顺序排序 (val x = TreeSet<Int>()),您可以这样做:

val subset = x.subSet(5,true,19,true)

这个操作几乎是免费的 (O(1)),你只需支付 (O(log(N))) 来迭代这个 TreeSet(迭代器构造将需要两次查找子集边界)。

之后,你可以用嘲笑的方式对它进行排序:

println(subset.toSortedSet(compareBy { it.toString() }))