我有大量的SortedSet<Long>
结构:
1, 2, 5, 8, 10, 35, 77, ...
5, 9, 35, 50, 132, ...
2, 4, 8, 15, 17, 23, ...
... hundreds of thousands of such rows...
我需要找到一个数字,比如50
。在这个例子中(如果只有三组),它是77
。集数量巨大 - 数十万。你会建议什么算法?
答案 0 :(得分:3)
如果我理解正确,这是我的想法:
Collection<SortedSet<Long>> sets = //...
long minAfter50 = Long.MAX_VALUE;
for (SortedSet<Long> set : sets) {
final Long first = set.tailSet(51L).first();
minAfter50 = Math.min(minAfter50, first);
}
这是一个想法:
UPDATE(基于 @beerbajay 评论):如果SortedSet实际上是TreeSet
,则以下代码可能表现更好。此外,我确保每组中的值都大于50:
long minAfter50 = Long.MAX_VALUE;
for (TreeSet<Long> set : sets) {
final Long higher = set.higher(50L);
if (higher != null && higher < minAfter50) {
minAfter50 = higher;
}
}
答案 1 :(得分:1)
如果这是您允许的所有预计算,那么您唯一能做的就是在每个SortedSet上调用tailSet并找到最小值。
如果您允许一些额外的数据结构,最简单的方法是跟踪所有集合的并集,然后您只需要调用tailSet。
我怀疑你想要的答案都不是。也许你可以更好地描述你的约束?
答案 2 :(得分:0)
set实现为二叉搜索树,最后一个数字始终在最后。 你可以更容易地搜索大于50的数字,每组中的第一个数字大于50。