两组之间的匹配数字

时间:2014-05-14 20:01:29

标签: java algorithm data-structures

我有两个数字键的大数据集(每个数百万个条目),需要设置一个数据结构,我可以快速识别两组之间的关键匹配,从而允许一些固定的变化。

例如,如果一组中的值为356,我想在另一组中找到355,356或357的任何实例。我最初的想法是设置两个HashMaps,迭代一个密钥量最少的HashMaps,然后在范围内查询较大的一个(所以在较大的地图中查询355,356或357)。

我应该研究数值的特定数据结构/匹配算法吗?

3 个答案:

答案 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 + constantO(log N)。如果集合中的数据发生变化,您将不得不花费O(log N)使用类似的二进制搜索将其插入正确的位置。

选项二 - 使用Java Set。对于O(log N)来电+ .contains()来说,您需要为变体的每个元素调用.contains(),因此我们O(|V| * log N),其中|V|是变体大小。您还可以添加O(log N)的元素。

决定:我选择java集,因为要编写很多发烧代码,你不需要调试搜索/添加元素的代码。