海量数据去重排序bitmap(位图法)在java中实现的两种方法

yizhihongxing

海量数据去重排序bitmap(位图法)是一种高效的数据处理方法,可以有效提升数据处理的效率。在Java中实现海量数据去重排序bitmap(位图法)可以采用以下两种方法:

1. 使用Java BitSet类实现位图法

1.1 初始数据的准备

在使用位图法进行去重排序之前,需要先将原始数据以字符串的形式进行处理,并按照一定规则转化为二进制码。在这个例子中,我们将对原始数据进行排序,然后使用逗号分隔符将它们拼接成一个字符串,方便后续处理。

import java.util.Arrays;

public class BitMapDemo {
    private static final int N = 10000000;

    public static void main(String[] args) {
        int[] data = initData(N);     
        Arrays.sort(data);
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < N; i++) {
            sb.append(data[i]+",");    
        }
        String strData = sb.toString();
        System.out.println("排序后的数据:"+strData.substring(0, 200)+"...");
    }

    private static int[] initData(int n) {
        int[] data = new int[n];    
        for(int i = 0; i < n; i++) {
            data[i] = (int)(Math.random()*(n/10));    
        }
        System.out.println("初始数据:"+Arrays.toString(data).substring(0, 200)+"...");
        return data;
    }
}

1.2 使用BitSet进行去重排序

有了准备工作后,我们就可以使用Java BitSet类来完成海量数据的去重排序处理了。BitSet是Java中最原始的位集合类,它以比特位(bitset)的形式保存数据,通常用于大规模数据的处理,采用布隆过滤器和对数分类器等算法。在这个例子中,我们将首先使用具有确定位数的BitSet类来表示数据,然后在处理原始数据时,将每个数据转化为一个整数作为索引,并将其对应的位标记为1。这样,我们就可以将原始数据去重并排序。

以下是代码实现:

import java.util.BitSet;
import java.util.Arrays;

public class BitMapDemo {
    private static final int N = 10000000;

    public static void main(String[] args) {
        int[] data = initData(N);     
        Arrays.sort(data);
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < N; i++) {
            sb.append(data[i]+",");    
        }
        String strData = sb.toString();
        System.out.println("排序后的数据:"+strData.substring(0, 200)+"...");

        BitSet bs = new BitSet(N);
        int[] result = new int[N];
        int index = 0;
        for(String s : strData.split(",") ) {
            int i = Integer.parseInt(s);
            if(!bs.get(i)) {
                bs.set(i);
                result[index++] = i;
            }
        }
        System.out.println("去重后的数据:"+Arrays.toString(Arrays.copyOf(result, index)).substring(0, 200)+"...");
    }

    private static int[] initData(int n) {
        int[] data = new int[n];    
        for(int i = 0; i < n; i++) {
            data[i] = (int)(Math.random()*(n/10));    
        }
        System.out.println("初始数据:"+Arrays.toString(data).substring(0, 200)+"...");
        return data;
    }
}

以上代码中,我们使用了BitSet类创建了一个大小为N的位集合,将数据转换为一个整数,并根据该整数设置BitSet中对应的位数。最终,我们将根据BitSet中的0和1位,生成一个去重后的排序数组。

2. 使用Java布隆过滤器实现位图法

在BitSet方法中,我们使用一个数组和BitSet包装类来表示每个数据是否存在的状态,并将每个数转换为一个整数并转为位数,但是对于不同的数据,可能存在相同的位,导致误判。而在布隆过滤器中使用哈希函数对每个数据进行哈希映射,并在布隆过滤器中随机生成一些哈希函数,这样可以提高去重效率。以下是用Java实现布隆过滤器的代码示例:

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
import java.util.Arrays;

public class BloomFilterDemo {
    private static final int N = 10000000;
    private static final double FPP = 0.1;

    public static void main(String[] args) {
        int[] data = initData(N);     
        Arrays.sort(data);
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < N; i++) {
            sb.append(data[i]+",");    
        }
        String strData = sb.toString();
        System.out.println("排序后的数据:"+strData.substring(0, 200)+"...");

        BloomFilter<Integer> bf = BloomFilter.create(Funnels.integerFunnel(), N, FPP);
        int[] result = new int[N];
        int index = 0;
        for(String s : strData.split(",") ) {
            int i = Integer.parseInt(s);
            if(!bf.mightContain(i)) {
                bf.put(i);
                result[index++] = i;
            }
        }
        System.out.println("去重后的数据:"+Arrays.toString(Arrays.copyOf(result, index)).substring(0, 200)+"...");
    }

    private static int[] initData(int n) {
        int[] data = new int[n];    
        for(int i = 0; i < n; i++) {
            data[i] = (int)(Math.random()*(n/10));    
        }
        System.out.println("初始数据:"+Arrays.toString(data).substring(0, 200)+"...");
        return data;
    }
}

在以上代码中,我们使用了Google Guava工具包中的BloomFilter类创建了一个大小为N的布隆过滤器,并使用一个100万分之一的假阳性率(false positive probability)来创建该过滤器。最后,通过BloomFilter类提供的put(boolean)和mightContain(K)方法,我们可以将原始数据进行去重并排序。

以上是实现海量数据去重排序bitmap(位图法)在Java中实现的两种方法,希望可以帮助到您。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:海量数据去重排序bitmap(位图法)在java中实现的两种方法 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 关于JavaScript作用域你想知道的一切

    关于JavaScript作用域你想知道的一切 什么是作用域? 在介绍作用域之前,我们先来看一下变量的定义。在JavaScript中,我们可以通过var、let或const三个关键字来声明变量。 var a = 1; // 使用var声明的变量 let b = 2; // 使用let声明的变量 const c = 3; // 使用const声明的变量 那么,作…

    Java 2023年6月16日
    00
  • 详解Mybatis注解写法(附10余个常用例子)

    详解Mybatis注解写法(附10余个常用例子) Mybatis是一种基于Java的开源持久层框架,提供了基于XML和注解两种方式来配置数据映射关系。本文将详细讲解Mybatis注解写法,并提供10余个常用的例子。 基本概念 Mybatis注解是一种Java注解,用于替代XML配置文件,在Java代码中直接定义SQL语句和相关映射关系。常用的注解有:@Sel…

    Java 2023年5月20日
    00
  • Apache httpd 入门实战(2)–简单使用

    本文主要介绍 Apache 的实际使用,文中所使用到的软件版本:Centos 7.9.2009、Httpd 2.4.55。 1、反向代理 涉及到 Https 站点时,安装 Apache 时需要启用 ssl,可参考 Apache httpd 入门实战(1)–概念及安装。 1.1、被代理站点为 Http 站点 打开 conf/httpd.conf 文件,修改或…

    Java 2023年4月17日
    00
  • Spring Security常用过滤器实例解析

    接下来我将为您详细讲解 Spring Security 常用过滤器实例解析的完整攻略。 1. Spring Security 常用过滤器简介 Spring Security 是一种强大且高度可定制的认证和授权框架,它为 Web 应用程序提供了安全性。Spring Security 通过使用一系列过滤器来保护应用程序,并控制对资源的认证和授权访问。Spring…

    Java 2023年5月20日
    00
  • JAVA正则表达式及字符串的替换与分解相关知识总结

    JAVA正则表达式及字符串的替换与分解相关知识总结 什么是正则表达式? 正则表达式是一种用于匹配、解析或替换文本的表示模式。它使用非常简洁的语法,可以表示较为复杂的字符串匹配。在Java中,使用java.util.regex库来支持正则表达式操作。 正则表达式的语法 1. 字符匹配 在正则表达式中,只需要用普通字符就可以表示这个字符本身。例如,正则表达式a表…

    Java 2023年5月27日
    00
  • java基础详解之数据类型知识点总结

    Java基础详解之数据类型知识点总结 一、Java中的数据类型 Java中的数据类型可以分为两大类: 基本数据类型(Primitive Types):包括整型(byte、short、int、long)、浮点型(float、double)、字符型(char)和布尔型(boolean)四种。 引用数据类型(Reference Types):包括类、接口、数组等。…

    Java 2023年5月26日
    00
  • SpringBoot整合Mybatis与thymleft实现增删改查功能详解

    我会尽可能详细地讲解“SpringBoot整合Mybatis与Thymeleaf实现增删改查功能”的攻略,让您可以轻松实现该功能。 1. 前置条件 在开始之前,确保您已经完成以下准备工作: 安装Java JDK和IDE(如Eclipse、IntelliJ IDEA等) 掌握SpringBoot、Mybatis及Thymeleaf的基础知识 2. 创建Spri…

    Java 2023年5月20日
    00
  • Java如何找出数组中重复的数字

    要找出Java数组中的重复数字,可能有以下几种方法: 方法一:暴力方法 这个方法虽然简单易懂,但其时间复杂度也比较高,不过对于小型数组来说还是可以接受的。 简单来说就是遍历整个数组,对于每一个数字,都依次遍历后面的数字,如果发现该数字已经出现过,那么就把它输出出来即可。 这个方法的Java代码示例如下: public void findDuplicate(i…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部