一组的偏移和限制

时间:2015-06-04 06:45:32

标签: java algorithm collections

我有两组有序Integer s - SortedSet<Integer>,称他们为set1set2。我需要找到一个联合设置并返回子集偏移量10限制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

请注意,联盟中811的基数为1

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

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

2 个答案:

答案 0 :(得分:1)

算法非常简单。

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

答案 1 :(得分:0)

@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.

注意:这仅适用于已排序的集合。
如果不清楚,请告诉我。