java实现快速查找一个整数是否出现在1亿个整数中

版权声明:本文为博主原创文章,如需转载请注明原文出处: https://blog.csdn.net/u010979642/article/details/91128400

set 集合实现查找

将1 亿个数存储在 set 集合内, 然后根据 contains 方法来判断该整数是否存在集合中即可。

bitmap 位图实现查找

程序实现

public class AnswerApp {

    public static void main(String[] args) {
        long startTime = System.currentTimeMillis();

        BitSet bitSet = new BitSet(Integer.MAX_VALUE);

        int count = 1 << 27;
        System.out.println("本次要在 " + count + " 个数中进行查看某个整数是否在其中");
        System.out.println();

        System.out.println("加载数据到内存中...\n");
        // 随机生成 Integer.MAX_VALUE 以内的 count 个整数
        for (int i = 0; i < count; i++) {
            bitSet.set(new Random().nextInt(Integer.MAX_VALUE));
        }
        System.out.println("加载数据到内存耗时: " + (System.currentTimeMillis() - startTime) + " ms.");
        startTime = System.currentTimeMillis();
        System.out.println();

        System.out.println("查找中...");
        System.out.println("bitSet 的总大小: " + bitSet.length());
        System.out.println();

        System.out.println("整数 1024 是否在" + count +"个数当中: " + bitSet.get(1024));
        System.out.println("整数 20190607 是否在" + count +"个数当中: " + bitSet.get(20190607));
        System.out.println();

        // 把整数 20190607 放到数字容器中
        bitSet.set(20190607);
        // 此时再看 20190607 是否存在数字容器内
        System.out.println("整数 20190607 是否在" + count +"个数当中: " + bitSet.get(20190607));
        System.out.println();

        // 把整数 20190607 从数字容器内移除
        bitSet.set(20190607, false);
        // 此时再看 20190607 是否存在数字容器内
        System.out.println("整数 20190607 是否在" + count +"个数当中: " + bitSet.get(20190607));
        System.out.println();

        System.out.println("查找数据耗时: " + (System.currentTimeMillis() - startTime) + " ms.");
    }
}    

运行输出

本次要在 134217728 个数中进行查看某个整数是否在其中

加载数据到内存中...

加载数据到内存耗时: 21029 ms.

查找中...
bitSet 的总大小: 2147483641

整数 1024 是否在134217728个数当中: false
整数 20190607 是否在134217728个数当中: false

整数 20190607 是否在134217728个数当中: true

整数 20190607 是否在134217728个数当中: false

查找数据耗时: 0 ms.

两种方式占用内存对比

  • 采用 set 集合实现, 1亿个int类型整数占用空间是 4亿字节 大约是 400MB

    • 1亿 int 整数 = 4字节 * 1 亿 = 4亿字节
  • 采用位图实现, 因为 一个int 类型是32位, 所以占用的空间是 set 方式的 1/32, 即 400/32=12.5MB

换算规则

  • 1GB = 1024MB = 1024 * 1024 KB = 1024 * 1024 * 1024 Byte = 1073741824 字节 约等于 十亿字节

  • int 值的取值范围 -2147483648(-2的31次方) ~ 2147483647(2的31次方 - 1)

  • 1个 int 类型整数 = 二进制位数32位(bit) = 4字节(byte)

Reference

猜你喜欢

转载自blog.csdn.net/u010979642/article/details/91128400