【发布时间】:2019-10-15 13:12:43
【问题描述】:
假设你有类似的东西
class Person {
LocalDate bornOn;
LocalDate diedOn;
}
假设您有一堆“Person”实例,您可以以任何您喜欢的方式存储它们。
编写一个可以列出在给定时间所有还活着的人的高效函数的最佳方法是什么?
数据结构也应该是有效的可变的,特别是在添加新元素方面。
即概念上类似于
List<Person> alive(List<Person> people, LocalDate date) {
return people.stream().filter(x -> x.bornOn.compareTo(date) <= 0 && x.diedOn.compareTo(date) > 0).collect(Collectors.toList())
}
只会更有效率。
我的第一个直觉是拥有两个 NavigableMaps
NavigableMap<LocalDate, Person> peopleSortedByBornOn;
NavigableMap<LocalDate, Person> peopleSortedByDiedOn;
每个都可以用给定日期的 headMap() / tailMap() 查询,这些查询的交集就是结果。
有没有更快或更方便的解决方案?甚至可能是某种广泛使用的 Java 集合/映射类型支持这样的操作?
【问题讨论】:
-
如果你可以使用任何你喜欢的数据结构并且唯一的目标是快速查询,那么你可以使用从第一个出生日期到最后一个死亡日期的所有日期的(排序的)哈希图作为键和一个人的集合/列表作为值。这是最快的查询方式。
-
@TobiasOtto 谢谢,确实如此 - 我应该提到,结构也应该是有效的可变的。
-
我能想到的每一个优化,你都必须对另一个约束施加压力。一些可能有帮助的问题……你关心强调记忆吗?当您说可变时,您是指更改出生/死亡值还是添加新人?该算法应该是线程安全的,还是您总是想使用单个线程对其进行过滤?您是否关心初始加载时间(创建结构可能很慢)?你关心删除/插入性能吗?
-
@IoannisDeligiannis : 1) 添加新人,假设 BornOn / deadOn 永远不会改变给定的人。 2) 单线程 3) 假设您在没有任何数据的情况下开始,并且您在移动中以快速但不可预测的信息流接收 Person 对象 4) 不需要删除;插入是根据上一点
-
@Bogey 您最多可以拥有多少人?