繁体   English   中英

使用 Java 中的 BitSet 处理 Long 数据

[英]Handling Long data with BitSet in Java

我有一个范围从 0 到 Long.MAX_VALUE 的大型数据集,
并想使用 BitSet 搜索任何重复项。

虽然 Java BitSet 不允许长时间使用其功能。
是否可以使用 BitSet 实现?

// incoming data have range 0 to 9,223,372,036,854,775,807 (Long max value)  
// e.g. 1, 3, 5, 1, 2_000_000_000, 2_000_000_000
// expected output: 1, 2_000_000_000, as they appear twice

long[] myData = new long[]{1, 3, 5, 1, 2_000_000_000, 2_000_000_000};
// int[] myData = new int[]{1, 3, 5, 1}; // it working well for int array
BitSet bs = new BitSet();
        
for(int i = 0; i < myData.length; i++) {
    if(bs.get(myData[i])) {  // fail here as bitset only accept int
        System.out.println("duplicated number: " + myData[i]);
    } else {
        bs.set(myData[i]); // same here
    }
}

可以通过查看先前设置的位来使用BitSet 这将构成重复值。 但是,您不能将 position 设置为大于 Integer.MAX_VALUE (并且处理这么大的多头范围是不可行的)。 所以它不适用于您建议的范围。 而且我认为您仍然想记录重复项。

我会使用Map<Long,Long>进行频率计数。 然后,您可以确定提供的每个值的确切计数。 并且定位 map 的下一个 Key 与计算哪个内部 long 值保存所需位相当。 所以我不相信性能是这里的一个因素。

如果您只是想消除重复项,则只需将它们放入Set<Long>

根据您的评论,查看这个在 BitSet 中保存一个大值的简单测试。

BitSet bitSet = new BitSet();
bitSet.set(Integer.MAX_VALUE);
long[] backingArray = bitSet.toLongArray();
System.out.printf("Size of backing array = %,d longs.%n",backingArray.length);

印刷

Size of backing array = 33,554,432 longs.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM