微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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() }))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。