你会建议什么样的搜索算法或数据结构?

时间:2012-05-23 19:53:07

标签: java algorithm search sorting

我有大量的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。集数量巨大 - 数十万。你会建议什么算法?

3 个答案:

答案 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);
}

这是一个想法:

  • 遍历所有输入集
  • 裁剪所有小于或等于50的值
  • 获取裁剪集的第一个参数(保证大于50)
  • 计算上一步收集的最小值

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。