Java 集合的偏移量和极限

Java 集合的偏移量和极限,java,algorithm,collections,Java,Algorithm,Collections,我有两组有序的Integers-SortedSet,称它们为set1和set2。我需要找到集合的并集并返回子集偏移量10 limit 10。我是什么意思 Set1: 1,2,5,6,7,8,11,21,23,543,1002 Set2: 11,12,15,16,17,8,111,121,123,1543,11002 Union: 1,2,5,6,7,8,11,21,23,543,1002,12,15,16,17,111,121,123,1543,11002 Union offset 10

我有两组有序的
Integer
s-
SortedSet
,称它们为
set1
set2
。我需要找到集合的并集并返回子集偏移量10 limit 10。我是什么意思

Set1:
1,2,5,6,7,8,11,21,23,543,1002

Set2:
11,12,15,16,17,8,111,121,123,1543,11002

Union:
1,2,5,6,7,8,11,21,23,543,1002,12,15,16,17,111,121,123,1543,11002

Union offset 10 limit 10:
1002,12,15,16,17,111,121,123,1543,11002
注意,联合中
8
11
的基数是
1

我正在寻找一种算法,它允许我不将整个集合加载到内存中(因为这些集合可能非常大,我不想浪费服务器的资源)。有办法吗?也许像
commons
guava
这样的即时库可以提供帮助


UPD:我自己不使用Java 8,但使用它的解决方案也很有趣。

算法非常简单

Create empty hash Create empty array Set waste counter to 0 Iterate all sets (2 or more) Iterate set values If value not in hash Insert value into hash Increase waste counter If waste counter > offset (10) Insert value into array If array length == limit (10) Done - return array 创建空哈希 创建空数组 将废物计数器设置为0 迭代所有集合(2个或更多) 迭代集合值 如果值不在哈希中 在散列中插入值 增加废物计数器 如果废物计数器>偏移量(10) 在数组中插入值 如果数组长度==限制(10) 完成-返回数组
@Amit的答案是好的,但如果偏移量太大,可能仍然会有一点内存效率低下。这是另一种方法

Have a pointer on each set,
while offset > 0:
    if setA pointer value < setB pointer value
        increment setA pointer
        decrement offset
    else
        increment setB pointer

add "limit" numbers starting from setA pointer to the output array.
if end of setA is reached before "limit" numbers are present,
    add the remaining numbers from setB pointer to the output array.
每个集合上都有一个指针,
当偏移量>0时:
如果setA指针值
注意:这仅适用于排序集。

如果不清楚,请告诉我。

谢谢,如果你用Java而不是伪代码重新编写它会更有帮助。顺便问一下,这个算法比完整的serach算法效率高多少?很抱歉,我不使用Java(像你一样:-),但你要求的是一个算法,而不是实现这不是一个问题,只是一个建议)。关于效率,它在内存方面并不浪费(只有一些散列值是“浪费的”),并且在迭代方面进行了优化-您只访问您必须访问的内容。如果不在内存中加载set1,您无法从set2中删除重复项(或者为set2中的每个数字重新蚀刻所有set1,这可能是非常低效的性能方面)…@assylias-删除重复项不是目标,而是实现。关于“懒惰”方法,请参见我的答案。样本集未排序。认为那是错误的。此外,该算法不会起作用。考虑这些集合:A(10,11,12…20),B(1,2,3…10)具有偏移(10)和极限(10)。您的算法将首先排出集合B,然后排出集合a,然后失败。@Amit OP大约是2个分拣集。在算法中,我没有包括所有的边缘情况,比如如果集合小于偏移量或限制(这只是一种方法)。OP提到SortedSets是对的,但看看数据,它没有排序。关于“边缘情况”,没有任何,两组之间有20个不同的值,你应该跳过前10个,然后返回下10个(B组)。您的算法将崩溃或返回0值。而边缘案例非常重要。如果没有它们,许多算法可以通过几个因素进行改进。