【算法-位图法】在海量数据中查找重复元素

2023-10-13 19:30

本文主要是介绍【算法-位图法】在海量数据中查找重复元素,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是位图法?

举个简单例子,在java中一个int类型的数有32位,而这32只表示一个数太过浪费,于是就考虑让这32位可以表示32个数,每一位表示该数是否存在,例如:

这里用16位的二进制就能表示十六个数字,1表示存在,0表示不存在,上图就表示存在(16,12,6,4,1)这五个数。

在海量数据中查找重复出现的元素或者去除重复出现的元素也是常考的问题。针对此类问题,一般可以通过位图法实现,例如,已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数。

本题最好的解决办法就是通过位图法来实现。

解题思路:

8位整数可以表示的最大十进制数值为99999999,如果每个数字对应于位图中的一个bit位,那么存储八位整数需要99999999bit大约99Mbit,因为1Byte=8bit,所以99Mbit折合成内存为99/8=12.375MB的内存,及可以只用12.375MB的内存表示所有的8位数电话号码的内容。

程序代码如下:

import java.util.Random;
public class DuplicateTelephone{int randNum=100;int min=10000000;int max=99999999;int len=(max-min+1);int bit_per_word=32;int  word_offset(int b){return b/bit_per_word;}int bit_offset(int b){return b%bit_per_word;}void setBit(int[] words,int n){int temp=n;temp-=min;words[word_offset(temp)]|=(1<<bit_offset(temp));}void clearBit(int[] words,int n){words[word_offset(n)]&=~(1<<bit_offset(n));}boolean getBit(int[] words,int n){int result=words[word_offset(n)]&(1<<bit_offset(n));return result!=0;}public void sort(){int arr[]=new int[randNum];System.out.println("数组大小:"+randNum);int[] words=new int[len/bit_per_word+1];int count=0;Random r=new Random();for(int j=0;j<randNum;j++){arr[j]=r.nextInt(len);arr[j]+=min;System.out.print(arr[j]+" ");}System.out.println();for(int j=0;j<randNum;j++){setBit(words,arr[j]);}System.out.println("排序后a为:");for(int i=0;i<len;i++){if(getBit(words,i)){System.out.print(i+min+" ");count++;}}System.out.println();System.out.println("总个数为:"+count);}public static void main(String[] args){new DuplicateTelephone().sort();}}

运行的结果为:

数组大小:100
46875852 63059260 46888254 54260213 84901496 58876931 28753082 72176161 30014077 84850078 31950213 14204495 26230245 27850510 32455193 68366470 52371514 87138574 94489525 45678876 90450237 42341450 24655913 43282877 49446847 42320941 84516417 35313419 59903775 35761368 11337291 46450272 93115232 55490862 11998766 73065445 47942924 18581547 58818184 77268172 99380374 80558928 16202169 95248485 20644397 34063612 20913170 94324174 67502076 80090509 45820098 81312556 32858162 16476350 15080157 45289864 99027018 87240729 89981567 52198533 39085177 76494986 65134775 93827194 13834939 71752586 32473580 67759555 29073921 72452538 98008564 58115033 64844962 59371680 86529508 69079674 61521841 96326355 25073903 19962950 33966761 83534685 38855968 14084970 85023410 78286139 81124660 48083315 57208466 72108161 26193937 67771844 22611251 51376666 43171943 82768547 47796300 19563949 91347170 47639405
排序后a为:
11337291 11998766 13834939 14084970 14204495 15080157 16202169 16476350 18581547 19563949 19962950 20644397 20913170 22611251 24655913 25073903 26193937 26230245 27850510 28753082 29073921 30014077 31950213 32455193 32473580 32858162 33966761 34063612 35313419 35761368 38855968 39085177 42320941 42341450 43171943 43282877 45289864 45678876 45820098 46450272 46875852 46888254 47639405 47796300 47942924 48083315 49446847 51376666 52198533 52371514 54260213 55490862 57208466 58115033 58818184 58876931 59371680 59903775 61521841 63059260 64844962 65134775 67502076 67759555 67771844 68366470 69079674 71752586 72108161 72176161 72452538 73065445 76494986 77268172 78286139 80090509 80558928 81124660 81312556 82768547 83534685 84516417 84850078 84901496 85023410 86529508 87138574 87240729 89981567 90450237 91347170 93115232 93827194 94324174 94489525 95248485 96326355 98008564 99027018 99380374
总个数为:100

这篇关于【算法-位图法】在海量数据中查找重复元素的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/205365

相关文章

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

MySQL中删除重复数据SQL的三种写法

《MySQL中删除重复数据SQL的三种写法》:本文主要介绍MySQL中删除重复数据SQL的三种写法,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录方法一:使用 left join + 子查询删除重复数据(推荐)方法二:创建临时表(需分多步执行,逻辑清晰,但会

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

更改docker默认数据目录的方法步骤

《更改docker默认数据目录的方法步骤》本文主要介绍了更改docker默认数据目录的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1.查看docker是否存在并停止该服务2.挂载镜像并安装rsync便于备份3.取消挂载备份和迁

不删数据还能合并磁盘? 让电脑C盘D盘合并并保留数据的技巧

《不删数据还能合并磁盘?让电脑C盘D盘合并并保留数据的技巧》在Windows操作系统中,合并C盘和D盘是一个相对复杂的任务,尤其是当你不希望删除其中的数据时,幸运的是,有几种方法可以实现这一目标且在... 在电脑生产时,制造商常为C盘分配较小的磁盘空间,以确保软件在运行过程中不会出现磁盘空间不足的问题。但在

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

Mybatis拦截器如何实现数据权限过滤

《Mybatis拦截器如何实现数据权限过滤》本文介绍了MyBatis拦截器的使用,通过实现Interceptor接口对SQL进行处理,实现数据权限过滤功能,通过在本地线程变量中存储数据权限相关信息,并... 目录背景基础知识MyBATis 拦截器介绍代码实战总结背景现在的项目负责人去年年底离职,导致前期规