我有两个数字键的大数据集(每个数百万个条目),需要设置一个数据结构,我可以快速识别两组之间的关键匹配,从而允许一些固定的变化。
例如,如果一组中的值为356,我想在另一组中找到355,356或357的任何实例。我最初的想法是设置两个HashMaps,迭代一个密钥量最少的HashMaps,然后在范围内查询较大的一个(所以在较大的地图中查询355,356或357)。
我应该研究数值的特定数据结构/匹配算法吗?
答案 0 :(得分:1)
在这种情况下,也许java BitSet可能有用。这是一个使用大小= 1000000且范围= 5的BitSet的代码示例,用于检查从第一组到第二组的每个值:
import java.util.*;
import java.lang.*;
import java.io.*;
class CheckRange
{
public static void main (String[] args) throws java.lang.Exception
{
int range = 5;
int maxSize = 1000000;
// Prepare the main BitSet (bs)
BitSet bs = new BitSet(maxSize);
bs.set(357);
bs.set(599001);
bs.set(123456);
// ...
// Prepare the BitSet to check in
BitSet bs2 = new BitSet(maxSize);
bs2.set(5688);
bs2.set(566685);
bs2.set(988562);
// ...
for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i+1)) {
// Compute the ranges, checking the boundaries
int minIndex = Math.max(i - range, 0);
int maxIndex = Math.min(i + range, maxSize);
// Extract the matching subset
BitSet subset = bs2.get(minIndex, maxIndex);
// Print the number of bits set
System.out.println("Number of bit set int bs2 from bs at index " + i + " is " + subset.cardinality());
}
}
}
答案 1 :(得分:0)
我建议你从Java Set开始。您正在寻找的“两组之间的匹配”听起来很像一组交集。
请参阅API for set operations in Java?并查看retainAll
的说明。
答案 2 :(得分:0)
我会尝试总结一下。
选项一 - 排序数组。使用二进制搜索,您将能够找到具有O(log N)
复杂度的精确值(此处和下面N
是结构中的多个元素)。因此,对于您的操作 - log n (search in the first set) + log n (search in the second) + constant (check what you called variation)
,2 * log N + constant
即O(log N)
。如果集合中的数据发生变化,您将不得不花费O(log N)
使用类似的二进制搜索将其插入正确的位置。
选项二 - 使用Java Set。对于O(log N)
来电+ .contains()
来说,您需要为变体的每个元素调用.contains()
,因此我们O(|V| * log N)
,其中|V|
是变体大小。您还可以添加O(log N)
的元素。
决定:我选择java集,因为要编写很多发烧代码,你不需要调试搜索/添加元素的代码。