Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 您建议采用什么搜索算法或数据结构?_Java_Algorithm_Search_Sorting - Fatal编程技术网

Java 您建议采用什么搜索算法或数据结构?

Java 您建议采用什么搜索算法或数据结构?,java,algorithm,search,sorting,Java,Algorithm,Search,Sorting,我有大量的SortedSet结构: 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。电视机的数量是巨大的——数十万台。你会建议什么算法?如果我理解正确,以下是我的想法: Collection<SortedSet<Long

我有大量的
SortedSet
结构:

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
。电视机的数量是巨大的——数十万台。你会建议什么算法?

如果我理解正确,以下是我的想法:

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

如果我理解正确,以下是我的想法:

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的第一个数字。

集合被实现为一个二进制搜索树,最大的数字始终位于最后一个。
您可以更轻松地搜索大于50的号码,总是在每组中找到大于50的第一个号码。

如果这是您允许的所有预计算,那么您唯一能做的就是在每个分拣集上调用tailSet并找到最小值

如果允许一些额外的数据结构,最简单的方法就是跟踪所有集合的并集,然后只需调用tailSet即可


我想这两个问题都不是你想要的答案。也许您可以更好地描述您的约束条件?

如果这就是您所允许的所有预计算,那么您唯一能做的就是调用每个SortedSet上的tailSet并找到最小值

如果允许一些额外的数据结构,最简单的方法就是跟踪所有集合的并集,然后只需调用tailSet即可



我想这两个问题都不是你想要的答案。也许您可以更好地描述您的约束条件?

您的意思是希望在合并列表的给定值(
50
)之后有下一个值吗?是的,没错,从“合并列表”中,如果77出现在多个集合中会怎样?你在乎哪一组,还是你只是想在任何一组中找到下一个最高的数字?另外,如果一个不同的集合包含50个呢?是50个“下一个”的实例,还是“下一个成员严格大于‘当前’值”?您的问题没有明确说明。您也没有提到在查询之间是否要更新集合。如果没有,只需创建一个合并的排序值集即可。(1)您能告诉我们每个值集的大小吗?(2) 您需要运行多少个这样的查询?(3) 集合是否可以在查询之间更改,或者它们是一成不变的?您的意思是希望在合并列表的给定值(
50
)之后有下一个值吗?是的,确切地说,从“合并列表”中,如果77出现在多个集合中怎么办?你在乎哪一组,还是你只是想在任何一组中找到下一个最高的数字?另外,如果一个不同的集合包含50个呢?是50个“下一个”的实例,还是“下一个成员严格大于‘当前’值”?您的问题没有明确说明。您也没有提到在查询之间是否要更新集合。如果没有,只需创建一个合并的排序值集即可。(1)您能告诉我们每个值集的大小吗?(2) 您需要运行多少个这样的查询?(3) 这些集合是否可以在查询之间更改,或者它们是一成不变的?考虑到所有已分类的集合都已创建,这似乎是最有效的方法。合并它们或创建任何其他数据结构肯定效率较低。如果使用
TreeSet
作为
SortedSet
实现,则可以通过使用来避免在
tailSet()
中创建视图的成本<代码>第一个=设置更高(50l)@beerbajay:我根据你的宝贵意见更新了我的答案,希望你不要介意。您不会找到更有效的实现。嗯……有两个变量:集合的数量(
m
)和它们的大小(
n
)。此解决方案是
O(m log n)
。很明显,您必须至少查看每个
m
集合一次,而且很明显,您无法在
O(log n)
以下的时间内确定上述
50
集合中的值。这有点手工操作,但我想我相信。鉴于所有的分类数据集都已经创建,这似乎是最有效的方法。合并它们或创建任何其他数据结构肯定效率较低。如果使用
TreeSet
作为
SortedSet
实现,则可以通过使用来避免在
tailSet()
中创建视图的成本<代码>第一个=设置更高(50l)@beerbajay:我根据你的宝贵意见更新了我的答案,希望你不要介意。您不会找到更有效的实现。嗯……有两个变量:集合的数量(
m
)和它们的大小(
n
)。此解决方案是
O(m log n)
。很明显,您必须至少查看每个
m
集合一次,而且很明显,您无法在
O(log n)
以下的时间内确定上述
50
集合中的值。这有点牵强,但我想我相信了。对,这些选择对我都不好。主要是因为他们太慢了。我在这里寻找一些技巧。我没有任何限制。@Keith的第二个选择是“把戏”。也就是说,使用不同的数据结构,而不是排序集列表。例如,一组已排序的(value,listID)对。现在,对于n个值的m个列表,查找的是O(log(mn)),而不是O(m log n)。如果没有任何约束,则从每个值到下一个更高的值预计算一个
HashMap
<代码>O(1)。(通过将所有值放入一个数组中进行预计算,对它们进行排序,然后在
HashMap
中输入每个相邻的值对)对,这些选项对我都不好。主要是因为他们太慢了。我在这里寻找一些技巧。我没有任何限制。@Keith的第二个选择是“把戏”。也就是说,使用不同的数据结构,而不是排序集列表。例如,一组已排序的(val